Skip to content

Commit 79187a1

Browse files
authored
Merge pull request #69 from sandeepkhot/NL2SQL_Agent_fix
Updated the agents and tools
2 parents efaa21f + 03f5615 commit 79187a1

17 files changed

+338
-107
lines changed

autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_agent.sql

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,30 @@ VAR v_ai_profile_name VARCHAR2(128)
4242
EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
4343

4444
DECLARE
45-
l_sql VARCHAR2(500);
45+
l_sql VARCHAR2(500);
46+
l_schema VARCHAR2(128);
47+
l_session_user VARCHAR2(128);
4648
BEGIN
47-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
48-
EXECUTE IMMEDIATE l_sql;
49-
50-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
51-
EXECUTE IMMEDIATE l_sql;
52-
53-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
54-
EXECUTE IMMEDIATE l_sql;
55-
56-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema;
57-
EXECUTE IMMEDIATE l_sql;
49+
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
50+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
51+
52+
-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
53+
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
54+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
55+
EXECUTE IMMEDIATE l_sql;
56+
57+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
58+
EXECUTE IMMEDIATE l_sql;
59+
60+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
61+
EXECUTE IMMEDIATE l_sql;
62+
63+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema;
64+
EXECUTE IMMEDIATE l_sql;
65+
ELSE
66+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
67+
' (same as session user).');
68+
END IF;
5869

5970
DBMS_OUTPUT.PUT_LINE('Grants completed.');
6071
END;

autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_tools.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,17 @@ IS
7676
);
7777

7878
PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
79+
l_session_user VARCHAR2(128);
7980
BEGIN
81+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
82+
83+
-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
84+
IF UPPER(p_schema) = UPPER(l_session_user) THEN
85+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
86+
' (same as session user).');
87+
RETURN;
88+
END IF;
89+
8090
FOR i IN 1 .. p_objects.COUNT LOOP
8191
BEGIN
8292
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;

autonomous-ai-agents/database_inspect/README.md

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent
1+
# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent (23ai/26ai)
22

33
## Overview
44

55
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.
6+
This agent is supported only on Oracle Database **23ai** and **26ai**.
67

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

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

4950
## Prerequisites
5051

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

8081
## Architecture Overview
8182

82-
Run `database_inspect_tool.sql` to install `DATABASE_INSPECT` package and tools
83-
84-
Run `database_inspect_agent.sql` to configure and create the inspect agent team
85-
86-
execute `DATABASE_INSPECT.create_inspect_agent_team(<inspect_agent_team>, <attributes_in_json_object>)` to create an Inspect agent;
87-
83+
```text
84+
Run database_inspect_tool.sql to install DATABASE_INSPECT package and tools
85+
|
86+
v
87+
Run database_inspect_agent.sql to configure and create the inspect agent team
88+
|
89+
v
90+
Execute DATABASE_INSPECT.create_inspect_agent_team(<inspect_agent_team>, <attributes_in_json_object>)
91+
to create an inspect agent
92+
|
93+
v
8894
User query
89-
95+
|
96+
v
9097
<inspect_agent_team>
91-
92-
Agent Reasoning
93-
├── LIST_OBJECTS
94-
├── LIST_INCOMING_DEPENDENCIES
95-
├── LIST_OUTGOING_DEPENDENCIES
96-
├── RETRIEVE_OBJECT_METADATA
97-
├── RETRIEVE_OBJECT_METADATA_CHUNKS
98-
├── EXPAND_OBJECT_METADATA_CHUNK
99-
├── SUMMARIZE_OBJECT
100-
└── GENERATE_PLDOC
101-
102-
Final Verified Answer
98+
|
99+
v
100+
Agent reasoning
101+
|
102+
+-- LIST_OBJECTS
103+
+-- LIST_INCOMING_DEPENDENCIES
104+
+-- LIST_OUTGOING_DEPENDENCIES
105+
+-- RETRIEVE_OBJECT_METADATA
106+
+-- RETRIEVE_OBJECT_METADATA_CHUNKS
107+
+-- EXPAND_OBJECT_METADATA_CHUNK
108+
+-- SUMMARIZE_OBJECT
109+
`-- GENERATE_PLDOC
110+
|
111+
v
112+
Final verified answer
113+
```
103114

104115
---
105116

autonomous-ai-agents/database_inspect/database_inspect_agent.sql

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,30 +95,41 @@ EXEC :v_team_attributes_json := '&TEAM_ATTRIBUTES_JSON';
9595
-- 1. Grants (safe to re-run)
9696
----------------------------------------------------------------
9797
DECLARE
98-
l_sql VARCHAR2(500);
98+
l_sql VARCHAR2(500);
99+
l_schema VARCHAR2(128);
100+
l_session_user VARCHAR2(128);
99101
BEGIN
100-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
101-
EXECUTE IMMEDIATE l_sql;
102+
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
103+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
102104

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

106-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
107-
EXECUTE IMMEDIATE l_sql;
110+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
111+
EXECUTE IMMEDIATE l_sql;
108112

109-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema;
110-
EXECUTE IMMEDIATE l_sql;
113+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
114+
EXECUTE IMMEDIATE l_sql;
111115

112-
l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || :v_schema;
113-
EXECUTE IMMEDIATE l_sql;
116+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema;
117+
EXECUTE IMMEDIATE l_sql;
114118

115-
BEGIN
116-
l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || :v_schema;
119+
l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || l_schema;
117120
EXECUTE IMMEDIATE l_sql;
118-
EXCEPTION
119-
WHEN OTHERS THEN
120-
DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM);
121-
END;
121+
122+
BEGIN
123+
l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || l_schema;
124+
EXECUTE IMMEDIATE l_sql;
125+
EXCEPTION
126+
WHEN OTHERS THEN
127+
DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM);
128+
END;
129+
ELSE
130+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
131+
' (same as session user).');
132+
END IF;
122133

123134
DBMS_OUTPUT.PUT_LINE('Grants completed.');
124135
END;

autonomous-ai-agents/database_inspect/database_inspect_tool.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,17 @@ IS
6565
p_objects IN priv_list_t
6666
)
6767
IS
68+
l_session_user VARCHAR2(128);
6869
BEGIN
70+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
71+
72+
-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
73+
IF UPPER(p_schema) = UPPER(l_session_user) THEN
74+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
75+
' (same as session user).');
76+
RETURN;
77+
END IF;
78+
6979
FOR i IN 1 .. p_objects.COUNT LOOP
7080
BEGIN
7181
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;

autonomous-ai-agents/jira_insight/jira_insight_agent.sql

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,27 @@ VAR v_ai_profile_name VARCHAR2(128)
9292
EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
9393

9494
DECLARE
95-
l_sql VARCHAR2(500);
95+
l_sql VARCHAR2(500);
96+
l_schema VARCHAR2(128);
97+
l_session_user VARCHAR2(128);
9698
BEGIN
97-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
98-
EXECUTE IMMEDIATE l_sql;
99-
100-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema;
101-
EXECUTE IMMEDIATE l_sql;
102-
103-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
104-
EXECUTE IMMEDIATE l_sql;
99+
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
100+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
101+
102+
-- Avoid self-grant errors (ORA-01749) when target schema == connected user.
103+
IF UPPER(l_schema) <> UPPER(l_session_user) THEN
104+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema;
105+
EXECUTE IMMEDIATE l_sql;
106+
107+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
108+
EXECUTE IMMEDIATE l_sql;
109+
110+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
111+
EXECUTE IMMEDIATE l_sql;
112+
ELSE
113+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
114+
' (same as session user).');
115+
END IF;
105116

106117
DBMS_OUTPUT.PUT_LINE('Grants completed.');
107118
END;

autonomous-ai-agents/jira_insight/jira_insight_tools.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,17 @@ IS
111111
);
112112

113113
PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
114+
l_session_user VARCHAR2(128);
114115
BEGIN
116+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
117+
118+
-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
119+
IF UPPER(p_schema) = UPPER(l_session_user) THEN
120+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
121+
' (same as session user).');
122+
RETURN;
123+
END IF;
124+
115125
FOR i IN 1 .. p_objects.COUNT LOOP
116126
BEGIN
117127
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema;

autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_agent.sql

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
111111
-- 1. Grants (safe to re-run)
112112
----------------------------------------------------------------
113113
DECLARE
114-
l_sql VARCHAR2(500);
114+
l_sql VARCHAR2(500);
115+
l_schema VARCHAR2(128);
116+
l_session_user VARCHAR2(128);
115117
BEGIN
116-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
117-
EXECUTE IMMEDIATE l_sql;
118+
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
119+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
118120

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

122-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
123-
EXECUTE IMMEDIATE l_sql;
126+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
127+
EXECUTE IMMEDIATE l_sql;
128+
129+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
130+
EXECUTE IMMEDIATE l_sql;
131+
ELSE
132+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
133+
' (same as session user).');
134+
END IF;
124135

125136
DBMS_OUTPUT.PUT_LINE('Grants completed.');
126137
END;
@@ -285,4 +296,4 @@ PROMPT ======================================================
285296
PROMPT Installation finished successfully
286297
PROMPT ======================================================
287298

288-
alter session set current_schema = ADMIN;
299+
alter session set current_schema = ADMIN;

autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_tool.sql

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,17 @@ IS
163163
-- Helper: grant execute on list of objects
164164
----------------------------------------------------------------------------
165165
PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS
166+
l_session_user VARCHAR2(128);
166167
BEGIN
168+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
169+
170+
-- Avoid self-grant errors (ORA-01749) when installer schema == connected user.
171+
IF UPPER(p_schema) = UPPER(l_session_user) THEN
172+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema ||
173+
' (same as session user).');
174+
RETURN;
175+
END IF;
176+
167177
EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema;
168178
FOR i IN 1 .. p_objects.COUNT LOOP
169179
BEGIN
@@ -649,11 +659,11 @@ AS
649659
method => 'GET',
650660
uri => url
651661
);
652-
653-
l_result := DBMS_LOB.SUBSTR(DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DBMS_CLOUD.GET_RESPONSE_RAW(l_resp)), 32767, 1);
654662

663+
l_result := DBMS_CLOUD.GET_RESPONSE_TEXT(l_resp);
664+
l_result := DBMS_LOB.SUBSTR(l_result, 32767, 1);
655665
RETURN l_result;
656-
666+
657667
END get_url_content;
658668

659669
FUNCTION get_distinct_values_func (
@@ -1073,6 +1083,3 @@ END;
10731083

10741084
alter session set current_schema = ADMIN;
10751085

1076-
1077-
1078-

autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_agent.sql

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME';
115115
-- 1. Grants (safe to re-run)
116116
----------------------------------------------------------------
117117
DECLARE
118-
l_sql VARCHAR2(500);
118+
l_sql VARCHAR2(500);
119+
l_schema VARCHAR2(128);
120+
l_session_user VARCHAR2(128);
119121
BEGIN
120-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema;
121-
EXECUTE IMMEDIATE l_sql;
122+
l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema);
123+
l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
122124

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

126-
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema;
127-
EXECUTE IMMEDIATE l_sql;
130+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema;
131+
EXECUTE IMMEDIATE l_sql;
132+
133+
l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema;
134+
EXECUTE IMMEDIATE l_sql;
135+
ELSE
136+
DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema ||
137+
' (same as session user).');
138+
END IF;
128139

129140
DBMS_OUTPUT.PUT_LINE('Grants completed.');
130141
END;
@@ -259,4 +270,4 @@ PROMPT Installation finished successfully
259270
PROMPT ======================================================
260271

261272

262-
alter session set current_schema = ADMIN;
273+
alter session set current_schema = ADMIN;

0 commit comments

Comments
 (0)