Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,30 @@ VAR v_ai_profile_name VARCHAR2(128)
EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';

DECLARE
l_sql VARCHAR2(500);
l_sql VARCHAR2(500);
l_schema VARCHAR2(128);
l_session_user VARCHAR2(128);
BEGIN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
ELSE
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
' (same as session user).');
END IF;

DBMS_OUTPUT.PUT_LINE('Grants completed.');
END;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,17 @@ IS
);

PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
l_session_user VARCHAR2(128);
BEGIN
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
IF UPPER(p_schema) = UPPER(l_session_user) THEN
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
' (same as session user).');
RETURN;
END IF;

FOR i IN 1 .. p_objects.COUNT LOOP
BEGIN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;
Expand Down
53 changes: 32 additions & 21 deletions autonomous-ai-agents/database_inspect/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent
# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent (23ai/26ai)

## Overview

Select AI Inspect is an AI-powered database inspection tool built using the **Select AI Agent** framework. It enables users to explore, understand, and interact with database objects and their metadata using natural language.
This agent is supported only on Oracle Database **23ai** and **26ai**.

For definitions of **Tool**, **Task**, **Agent**, and **Agent Team**, see the top-level guide: [README](../README.md#simple-agent-execution-flow).

Expand Down Expand Up @@ -48,7 +49,7 @@ Users may define the inspection scope either at the individual object level or a

## Prerequisites

- Oracle Autonomous AI Database (26ai recommended)
- Oracle Database 23ai or 26ai (Autonomous AI Database supported)
- Select AI and `DBMS_CLOUD_AI_AGENT` enabled
- `ADMIN` or equivalent privileged user for installation
- A Select AI profile created with `DBMS_CLOUD_AI.CREATE_PROFILE`
Expand Down Expand Up @@ -79,27 +80,37 @@ You can also execute the contents of `database_inspect_tool.sql` and `database_i

## Architecture Overview

Run `database_inspect_tool.sql` to install `DATABASE_INSPECT` package and tools
Run `database_inspect_agent.sql` to configure and create the inspect agent team
execute `DATABASE_INSPECT.create_inspect_agent_team(<inspect_agent_team>, <attributes_in_json_object>)` to create an Inspect agent;
```text
Run database_inspect_tool.sql to install DATABASE_INSPECT package and tools
|
v
Run database_inspect_agent.sql to configure and create the inspect agent team
|
v
Execute DATABASE_INSPECT.create_inspect_agent_team(<inspect_agent_team>, <attributes_in_json_object>)
to create an inspect agent
|
v
User query
|
v
<inspect_agent_team>
Agent Reasoning
├── LIST_OBJECTS
├── LIST_INCOMING_DEPENDENCIES
├── LIST_OUTGOING_DEPENDENCIES
├── RETRIEVE_OBJECT_METADATA
├── RETRIEVE_OBJECT_METADATA_CHUNKS
├── EXPAND_OBJECT_METADATA_CHUNK
├── SUMMARIZE_OBJECT
└── GENERATE_PLDOC
Final Verified Answer
|
v
Agent reasoning
|
+-- LIST_OBJECTS
+-- LIST_INCOMING_DEPENDENCIES
+-- LIST_OUTGOING_DEPENDENCIES
+-- RETRIEVE_OBJECT_METADATA
+-- RETRIEVE_OBJECT_METADATA_CHUNKS
+-- EXPAND_OBJECT_METADATA_CHUNK
+-- SUMMARIZE_OBJECT
`-- GENERATE_PLDOC
|
v
Final verified answer
```

---

Expand Down
45 changes: 28 additions & 17 deletions autonomous-ai-agents/database_inspect/database_inspect_agent.sql
Original file line number Diff line number Diff line change
Expand Up @@ -95,30 +95,41 @@ EXEC :v_team_attributes_json := '&TEAM_ATTRIBUTES_JSON';
-- 1. Grants (safe to re-run)
----------------------------------------------------------------
DECLARE
l_sql VARCHAR2(500);
l_sql VARCHAR2(500);
l_schema VARCHAR2(128);
l_session_user VARCHAR2(128);
BEGIN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

BEGIN
l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || :v_schema;
l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM);
END;

BEGIN
l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM);
END;
ELSE
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
' (same as session user).');
END IF;

DBMS_OUTPUT.PUT_LINE('Grants completed.');
END;
Expand Down
10 changes: 10 additions & 0 deletions autonomous-ai-agents/database_inspect/database_inspect_tool.sql
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,17 @@ IS
p_objects IN priv_list_t
)
IS
l_session_user VARCHAR2(128);
BEGIN
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
IF UPPER(p_schema) = UPPER(l_session_user) THEN
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
' (same as session user).');
RETURN;
END IF;

FOR i IN 1 .. p_objects.COUNT LOOP
BEGIN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;
Expand Down
29 changes: 20 additions & 9 deletions autonomous-ai-agents/jira_insight/jira_insight_agent.sql
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,27 @@ VAR v_ai_profile_name VARCHAR2(128)
EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';

DECLARE
l_sql VARCHAR2(500);
l_sql VARCHAR2(500);
l_schema VARCHAR2(128);
l_session_user VARCHAR2(128);
BEGIN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
ELSE
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
' (same as session user).');
END IF;

DBMS_OUTPUT.PUT_LINE('Grants completed.');
END;
Expand Down
10 changes: 10 additions & 0 deletions autonomous-ai-agents/jira_insight/jira_insight_tools.sql
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,17 @@ IS
);

PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
l_session_user VARCHAR2(128);
BEGIN
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
IF UPPER(p_schema) = UPPER(l_session_user) THEN
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
' (same as session user).');
RETURN;
END IF;

FOR i IN 1 .. p_objects.COUNT LOOP
BEGIN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
-- 1. Grants (safe to re-run)
----------------------------------------------------------------
DECLARE
l_sql VARCHAR2(500);
l_sql VARCHAR2(500);
l_schema VARCHAR2(128);
l_session_user VARCHAR2(128);
BEGIN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
ELSE
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
' (same as session user).');
END IF;

DBMS_OUTPUT.PUT_LINE('Grants completed.');
END;
Expand Down Expand Up @@ -285,4 +296,4 @@ PROMPT ======================================================
PROMPT Installation finished successfully
PROMPT ======================================================

alter session set current_schema = ADMIN;
alter session set current_schema = ADMIN;
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,17 @@ IS
-- Helper: grant execute on list of objects
----------------------------------------------------------------------------
PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
l_session_user VARCHAR2(128);
BEGIN
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
IF UPPER(p_schema) = UPPER(l_session_user) THEN
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
' (same as session user).');
RETURN;
END IF;

EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema;
FOR i IN 1 .. p_objects.COUNT LOOP
BEGIN
Expand Down Expand Up @@ -649,11 +659,11 @@ AS
method => 'GET',
uri => url
);

l_result := DBMS_LOB.SUBSTR(DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DBMS_CLOUD.GET_RESPONSE_RAW(l_resp)), 32767, 1);

l_result := DBMS_CLOUD.GET_RESPONSE_TEXT(l_resp);
l_result := DBMS_LOB.SUBSTR(l_result, 32767, 1);
RETURN l_result;

END get_url_content;

FUNCTION get_distinct_values_func (
Expand Down Expand Up @@ -1073,6 +1083,3 @@ END;

alter session set current_schema = ADMIN;




Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
-- 1. Grants (safe to re-run)
----------------------------------------------------------------
DECLARE
l_sql VARCHAR2(500);
l_sql VARCHAR2(500);
l_schema VARCHAR2(128);
l_session_user VARCHAR2(128);
BEGIN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
EXECUTE IMMEDIATE l_sql;
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;

l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
EXECUTE IMMEDIATE l_sql;
ELSE
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
' (same as session user).');
END IF;

DBMS_OUTPUT.PUT_LINE('Grants completed.');
END;
Expand Down Expand Up @@ -259,4 +270,4 @@ PROMPT Installation finished successfully
PROMPT ======================================================


alter session set current_schema = ADMIN;
alter session set current_schema = ADMIN;
Loading