【发布时间】:2017-01-21 02:29:17
【问题描述】:
我正在尝试在 PLSQL 插入中执行插入语句并返回从使用序列的表上的触发器生成的 id,但是 我的错误剂量低于任何人对此有任何想法吗?
ORA-00905:缺少关键字
ORA-06512:在“ADMIN.F_INSERT_ORDER_DATA”,第 22 行
ORA-06512:在第 5 行
CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER,
P_NOTES IN VARCHAR2)
RETURN NUMBER
IS
vCreated_ON DATE := SYSDATE;
vORDER_ID NUMBER;
vSQL VARCHAR2 (1024);
BEGIN
vSQL := 'INSERT INTO orders'
||'(ORDER_ID,'
|| 'CUSTOMER_ID,'
|| 'NOTES,'
|| 'CREATED_BY,'
|| 'CREATED_ON)'
|| 'VALUES (NULL,' --ORDER_ID Filled by trigger
|| P_CUSTOMER_ID|| ',' --CUSTOMER_ID
|| ''''|| P_NOTES|| ''',' --NOTES
|| '''SYSTEM'',' --CREATED_BY
|| ''''|| vCREATED_ON|| ''')' --CREATED_ON
|| 'RETURNING ORDER_ID INTO vORDER_ID';
EXECUTE IMMEDIATE vSQL;
DBMS_OUTPUT.PUT_LINE(vORDER_ID);
RETURN (vORDER_ID);
END F_INSERT_ORDER_DATA;
/
如下调用函数
declare
result varchar2(1024);
begin
-- Call the function
result := F_INSERT_ORDER_DATA (1000,'----');
end;
代码更新
CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER,
P_NOTES IN VARCHAR2)
RETURN NUMBER
IS
vORDER_ID NUMBER;
vCreated_by VARCHAR2 (128) := 'SYSTEM';
vCreated_ON DATE := SYSDATE;
sql_stmt VARCHAR2 (1024);
BEGIN
sql_stmt :=
'INSERT INTO orders (ORDER_ID,
CUSTOMER_ID,
NOTES,
CREATED_BY,
CREATED_ON)
VALUES (NULL, --ORDER_ID Filled by trigger
:PCUSTOMER_ID, --CUSTOMER_ID
:PNOTES, --NOTES
:PCREATED_BY, --CREATED_BY
:PCREATED_ON, --CREATED_ON
RETURNING ORDER_ID INTO :vORDER_ID';
EXECUTE IMMEDIATE sql_stmt
USING P_CUSTOMER_ID,
P_NOTES,
VCreated_by,
vCreated_ON
RETURNING INTO vORDER_ID;
DBMS_OUTPUT.PUT_LINE (vORDER_ID);
RETURN (vORDER_ID);
END F_INSERT_ORDER_DATA;
/
调用函数
DECLARE
vSQL VARCHAR2 (4000);
var NUMBER;
BEGIN
vSQL := 'F_INSERT_ORDER_DATA(:P_CUSTOMER_ID,:P_NOTES);';
EXECUTE IMMEDIATE vSQL USING 1000, 'TEST' RETURNING INTO var;
DBMS_OUTPUT.PUT_LINE (var);
END;
【问题讨论】:
标签: oracle plsql oracle11gr2