本人有个表tab 有一个字段记录的是存储过程的具体名称,我希望遍历出这个字段,按名称执行存储过程(不存在传参问题)。编译通过,执行时报错:无效的SQL语句。红体字那一行。
CREATE OR REPLACE PROCEDURE SP_LINJIE1 IS
CURSOR CUR_OPT IS
SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
OPT_VALUE CUR_OPT%ROWTYPE;
BEGIN
OPEN CUR_OPT;
LOOP
FETCH CUR_OPT
INTO OPT_VALUE;
CASE
WHEN OPT_VALUE.STATE = 1 AND OPT_VALUE.STATE2 = 2 THEN
EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME; ELSE
DBMS_OUTPUT.PUT_LINE('invalid operation');
END CASE;
EXIT WHEN CUR_OPT%NOTFOUND;
END LOOP;
CLOSE CUR_OPT;
END;
CREATE OR REPLACE PROCEDURE SP_LINJIE1 IS
CURSOR CUR_OPT IS
SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
OPT_VALUE CUR_OPT%ROWTYPE;
BEGIN
OPEN CUR_OPT;
LOOP
FETCH CUR_OPT
INTO OPT_VALUE;
CASE
WHEN OPT_VALUE.STATE = 1 AND OPT_VALUE.STATE2 = 2 THEN
EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME; ELSE
DBMS_OUTPUT.PUT_LINE('invalid operation');
END CASE;
EXIT WHEN CUR_OPT%NOTFOUND;
END LOOP;
CLOSE CUR_OPT;
END;
EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME;
--改为
EXECUTE IMMEDIATE 'begin '||OPT_VALUE.PROCEDURE_NAME||'; end;';
应该为
EXECUTE IMMEDIATE 'call '||OPT_VALUE.PROCEDURE_NAME||'()';
我的过程没有in参数,只有一个out参数,单独执行时不输入参数执行成功。
而且我刚才查了存储过程的参数标准表示是:
create [or replace] procedure procedure_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
如果说必须有in的话,我确实单独执行成功了。
但若不给参数又报错。
搞不懂了?
ORA-06577: 输出参数不是关联变量
这个更看不懂了。
网上查到的解决方式是:在输出参数的位置放一个变量就可以了。因为只有在输入参数的位置放一个变量,在过程运行以后,才能将运行结果放到这个变量中,其它程序再从这个变量获取值。
还是没有解决问题。
CURSOR CUR_OPT IS
SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
OPT_VALUE CUR_OPT%ROWTYPE;
BEGIN
OPEN CUR_OPT;
LOOP
FETCH CUR_OPT
INTO OPT_VALUE;
EXECUTE IMMEDIATE 'begin 此处换成你的其中的存储过程名称; end;'; EXIT WHEN CUR_OPT%NOTFOUND;
END LOOP;
CLOSE CUR_OPT;
END;
CURSOR CUR_OPT IS
SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
OPT_VALUE CUR_OPT%ROWTYPE;
vi_out pls_integer;
BEGIN
OPEN CUR_OPT;
LOOP
FETCH CUR_OPT
INTO OPT_VALUE;
EXECUTE IMMEDIATE 'begin '|| OPT_VALUE.PROCEDURE_NAME ||'(:1); end;' using out :vi_out; EXIT WHEN CUR_OPT%NOTFOUND;
END LOOP;
CLOSE CUR_OPT;
END;
关键行的代码写成这样就可以了。
EXECUTE IMMEDIATE 'declare
val INTEGER;
begin '
||OPT_VALUE.PROCEDURE_NAME||
'(val); end;';
意思是:
放置一个和out参数一样的变量在那里,这样在调用过程时,才可以将输出结果存进去,而不会报“参数个数或类型错误”。
而之前报:“输出参数不是关联变量”,是因为我给的参数类型与调用过程中的out类型不一致(或没有声明,直接写死也是不行的)。谢谢大家,第一次发帖就得到这么多帮助,谢谢。