我正在尝试在PLSQL插入中执行insert语句,并返回从使用序列的表上的触发器生成的id 我得到的误差低于任何人对此有任何想法吗?
ORA-00905:缺少关键字
ORA-06512:at“ADMIN.F_INSERT_ORDER_DATA”,第22行
ORA-06512:第5行
w[nam] <- lapply(w[-1], function(x) as.integer((w[,1]==0) & (x==1)))
调用以下功能
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;
/
答案 0 :(得分:1)
您的代码几乎没有问题。一个是带有return子句的绑定是不正确的。请参阅以下链接的工作原理。
Execute Immediate with returning clause
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;
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 RETURNING INTO vORDER_ID ;
DBMS_OUTPUT.PUT_LINE(vORDER_ID);
RETURN(vORDER_ID);
END F_INSERT_ORDER_DATA;
/
演示:
SQL> declare
2 var varchar2(4000);
3 var1 number;
4 begin
5
6 var := 'insert into dummy_emp(empid)values(2) RETURNING empID INTO :var1';
7
8 execute immediate var
9 RETURNING INTO var1;
10 commit;
11
12 dbms_output.put_line(var1);
13
14 end;
15 /
2
PL/SQL procedure successfully completed.
SQL>
这就是你需要在PLSQL块中调用你的函数的方法:
DECLARE
var NUMBER;
BEGIN
var := F_INSERT_ORDER_DATA(1000,'TEST');
DBMS_OUTPUT.PUT_LINE (var);
END;
在Simple SQL中,您可以调用如下:
Select F_INSERT_ORDER_DATA(1000,'TEST') from dual;
答案 1 :(得分:0)
这是我的版本(我需要file_id
,这是另一个表的外键):
create or replace function INSERT_INTO_table_name_ID return number
is
v_file_name VARCHAR2(690) := 'List from .. on '||sysdate;
v_file_id NUMBER;
BEGIN
INSERT INTO table_name(file_id, file_name) --file_id filled by trigger to
VALUES (null, v_file_name)
RETURNING file_id
INTO v_file_id;
COMMIT;
RETURN(v_file_id);
END;
演示:
declare
v_id number;
begin
v_id := INSERT_INTO_table_name_ID ;
dbms_output.put_line(v_id);
end;