table 上的 PLSQL 插入和返回 id 表单触发器
PLSQL insert and returning id form trigger on table
我正在尝试在 PLSQL insert 中执行插入语句,并返回从使用序列的 table 上的触发器生成的 ID,但是
我低于错误剂量有人知道吗?
ORA-00905: missing keyword
ORA-06512: at "ADMIN.F_INSERT_ORDER_DATA", line 22
ORA-06512: at line 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;
您的代码几乎没有问题。一是与 return 子句的绑定不正确。请参阅下面它在 link.
中的工作原理
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;
在简单 SQL 中你可以调用如下:
Select F_INSERT_ORDER_DATA(1000,'TEST') from dual;
这是我的版本(我需要 file_id
这是另一个 table 的外键):
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;
我正在尝试在 PLSQL insert 中执行插入语句,并返回从使用序列的 table 上的触发器生成的 ID,但是 我低于错误剂量有人知道吗?
ORA-00905: missing keyword
ORA-06512: at "ADMIN.F_INSERT_ORDER_DATA", line 22
ORA-06512: at line 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;
您的代码几乎没有问题。一是与 return 子句的绑定不正确。请参阅下面它在 link.
中的工作原理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;
在简单 SQL 中你可以调用如下:
Select F_INSERT_ORDER_DATA(1000,'TEST') from dual;
这是我的版本(我需要 file_id
这是另一个 table 的外键):
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;