我试图用存储过程执行if-else,结果出错了。有人能告诉我哪里出错了吗。
Create or replace procedure schoolstudents(
LS1 OUT NUMBER,
LS2 OUT NUMBER,
tablename in VARCHAR2)
IS
lname VARCHAR2(128);
schoolId NUMBER;
my_sql VARCHAR2(200);
BEGIN
lname := tablename;
schoolId := function(lname);
IF lname=0
my_sql := 'Insert into sname values(''a'',''b'') RETURNING '||schoolId||', '||schoolId||' into :1, :2';
EXECUTE IMMEDIATE my_sql RETURNING OUT LS1, LS2;
ELSE:
EXECUTE IMMEDIATE my_sql RETURNING OUT LS1, LS2;
COMMIT;
END;
/
1条答案
按热度按时间o4hqfura1#
有很多问题。if语句的语法为
如果lname不为零,那么myu sql变量永远不会被赋值。
如果文字值要更改,请不要将其连接到sql中。使用绑定变量。否则,每个新的dml都必须进行硬解析,并导致性能问题。
lname被定义为varchar2,但是您将它与数字文本进行比较。
schoolid是一个数字,但您正在传递字符。
不需要使用execute immediate来执行这些操作。我不知道第二次执行应该是什么,但对于第一次,只需替换为:
(使用100200的示例值)
如果您有要插入的值,那么您已经知道要返回什么。如果dml正在调用sequence.nexval或其他返回计算值/派生值的函数,则返回非常有用。
我强烈建议您阅读一些pl/sql教程。