Reputation: 1119
can you help me in rectifying the following code.
execute immediate $$
declare
TABLE_CATALOG varchar default ('DB');
TABLE_SCHEMA varchar default ('SCH');
VIEW_NAME varchar default ('VIEW');
VEW resultset default (SELECT * from table(GET_OBJECT_REFERENCES(DATABASE_NAME =>:TABLE_CATALOG , SCHEMA_NAME =>:TABLE_SCHEMA, OBJECT_NAME =>:VIEW_NAME)));
begin
return table(VEW);
end;
$$
;
The above code is written in classic web interface
the following error appears when the above executed
SQL compilation error: syntax error line 1 at position 21 unexpected ':'.
when executed only the select statement by replacing bind variables with respective parameters query executing without any hiccups.
SELECT * from table(GET_OBJECT_REFERENCES(DATABASE_NAME =>'DB' , SCHEMA_NAME =>'SCH', OBJECT_NAME =>'VIEW'))
Upvotes: 0
Views: 80
Reputation: 56
While the GET_OBJECT_REFERENCES does expect a string literal, your variables are already strings, as declared by varchar default
. The error actually occurs, because the VEW resultset
assignment requires a literal query as a parameter or a string (when used with execute immediate
). You can achieve this by constructing the query first as shown below:
execute immediate $$
declare
TABLE_CATALOG varchar default ('DB');
TABLE_SCHEMA varchar default ('SCH');
VIEW_NAME varchar default ('VIEW');
QUERY varchar default ('SELECT * from table(GET_OBJECT_REFERENCES(DATABASE_NAME =>'||:TABLE_CATALOG||', SCHEMA_NAME =>'||:TABLE_SCHEMA||', OBJECT_NAME =>'||:VIEW_NAME||'))');
VEW resultset default (execute immediate QUERY);
begin
return table(VEW);
end;
$$
;
Upvotes: 2
Reputation: 175616
Based on GET_OBJECT_REFERENCES the parameters should be string literals.
Non-parametrized version:
DECLARE
TABLE_CATALOG varchar default ('DB');
TABLE_SCHEMA varchar default ('SCH');
VIEW_NAME varchar default ('View');
VEW resultset ;
SQL TEXT DEFAULT 'SELECT * FROM TABLE(GET_OBJECT_REFERENCES(
DATABASE_NAME=><DATABASE_NAME>,
SCHEMA_NAME=><SCHEMA_NAME>,
OBJECT_NAME=><OBJECT_NAME>))';
BEGIN
-- checking if object exists(input validation)
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
INTO TABLE_CATALOG, TABLE_SCHEMA, VIEW_NAME
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_CATALOG ILIKE :TABLE_CATALOG
AND TABLE_SCHEMA ILIKE :TABLE_SCHEMA
AND TABLE_NAME ILIKE :VIEW_NAME;
SQL := REPLACE(REPLACE(REPLACE(SQL
,'<DATABASE_NAME>', TABLE_CATALOG)
,'<SCHEMA_NAME>', TABLE_SCHEMA)
,'<OBJECT_NAME>', VIEW_NAME);
VEW := (EXECUTE IMMEDIATE :SQL);
return table(VEW);
END;
Sample data:
CREATE DATABASE DB;
CREATE SCHEMA SCH;
CREATE TABLE Tab1(id INT);
CREATE OR REPLACE VIEW View AS SELECT * FROM tab1;
Output:
Upvotes: 1