I have created a read-only procedure under catalog in my schema that will return 3 columns (SCHEMA_NAME, OBJECT_NAME, TOT_LINE_CNT).
--DROP PROCEDURE "ABC"."PROC_OBJ_LINE_CNT";
CREATE PROCEDURE "ABC"."PROC_OBJ_LINE_CNT"()
LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS
BEGIN
DECLARE v_arr_sch_name NVARCHAR(500) ARRAY;
DECLARE v_arr_obj_name NVARCHAR(500) ARRAY;
DECLARE v_arr_obj_code NCLOB ARRAY;
DECLARE v_tab_cnt INTEGER := 0;
DECLARE v_indx INTEGER;
DECLARE v_sch_name NVARCHAR(500);
DECLARE v_obj_name NVARCHAR(500);
DECLARE v_obj_code NCLOB;
DECLARE v_flg INTEGER := 1;
v_tab_code_base = SELECT SCHEMA_NAME AS sch_name, PROCEDURE_NAME AS obj_name, DEFINITION AS obj_code
FROM "SYS"."PROCEDURES" WHERE PROCEDURE_NAME NOT IN('PROC_ACTUAL_COPA_INSERTS', 'PROC_PLAN_COST_BASED_DETAILS','PROC_LOAD_COPA_COST_BASED_DETAILS')
UNION ALL
SELECT SCHEMA_NAME AS schema_name, FUNCTION_NAME AS obj_name, DEFINITION AS obj_code
FROM "SYS"."FUNCTIONS"
UNION ALL
SELECT SCHEMA_NAME AS schema_name, TRIGGER_NAME AS obj_name, DEFINITION AS obj_code
FROM "SYS"."TRIGGERS";
v_arr_sch_name := ARRAY_AGG (:v_tab_code_base.sch_name ORDER BY OBJ_NAME);
v_arr_obj_name := ARRAY_AGG (:v_tab_code_base.obj_name ORDER BY OBJ_NAME);
v_arr_obj_code := ARRAY_AGG (:v_tab_code_base.obj_code ORDER BY OBJ_NAME);
v_tab_cnt := IFNULL(CARDINALITY(:v_arr_obj_name),0);
IF :v_tab_cnt > 0
THEN
--Start of loop for record by record read
FOR v_indx IN 1..v_tab_cnt
DO
v_sch_name := NULL;
v_obj_name := NULL;
v_obj_code := NULL;
v_sch_name := :v_arr_sch_name[:v_indx];
v_obj_name := :v_arr_obj_name[:v_indx];
v_obj_code := :v_arr_obj_code[:v_indx];
v_tab_with_lines = SELECT P_SCHEMA_NAME AS SCHEMA_NAME, P_OBJECT_NAME AS OBJECT_NAME,P_LINE_NO AS LINE_NO,P_LINE_DATA AS LINE_DATA
FROM "ABC"."FN_SPLIT_LINES"(:v_sch_name,:v_obj_name, :v_obj_code);
IF :v_flg = 1
THEN
v_tab = SELECT SCHEMA_NAME,OBJECT_NAME,LINE_NO,LINE_DATA
FROM :v_tab_with_lines;
ELSE
v_tab = SELECT SCHEMA_NAME,OBJECT_NAME,LINE_NO,LINE_DATA
FROM :v_tab
UNION ALL
SELECT SCHEMA_NAME,OBJECT_NAME,LINE_NO,LINE_DATA
FROM :v_tab_with_lines;
END IF;
v_flg := :v_flg + 1;
END FOR;
--End of loop for record by record read
END IF;
SELECT SCHEMA_NAME,OBJECT_NAME, COUNT(DISTINCT LINE_NO) TOT_LINE_CNT FROM :v_tab GROUP BY SCHEMA_NAME, OBJECT_NAME;
END;
If I call this procedure using sql console, it works fine and gives me output.
CALL "ABC"."PROC_OBJ_LINE_CNT"();
My requirement is to call this procedure in one of scripted calculation view and save the data in one of the table variable so that I can use it for further calculations.
/********* Begin Procedure Script ************/
BEGIN
var1 = CALL "ABC"."PROC_OBJ_LINE_CNT";
var2 = SELECT a."SCHEMA_NAME",
a."OBJECT_NAME",
COUNT(a.LINE_NO) "TOT_DEF_CNT"
FROM "ABC".T_CODE_REVIEW a
WHERE b."REPORTING_DATE" =
(SELECT MAX(REPORTING_DATE) FROM "ABC".T_CODE_REVIEW);
var_out = SELECT a."SCHEMA_NAME",
a."OBJECT_NAME",
a."TOT_LINE_CNT",
b."TOT_DEF_CNT"
FROM :var1 a,
:var2 b
WHERE a."SCHEMA_NAME" = b."SCHEMA_NAME"
AND a."OBJECT_NAME" = b."OBJECT_NAME";
END /********* End Procedure Script ************/
Error: Incorrect Syntax near CALL :line4.
Any help would be appreciated.