我是Oracle和存储过程的新手。我在使用SQL Developer编写的简单存储过程中遇到了一些问题。
这是我的存储过程:
CREATE OR REPLACE PROCEDURE sp_user_create(
user_row IN t_user%ROWTYPE)
IS
BEGIN
INSERT INTO T_USER (FIRST_NAME,LAST_NAME,EMAIL)
VALUES(user_row.FIRST_NAME, user_row.LAST_NAME, user_row.EMAIL);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END sp_user_create;
当我尝试使用SQL Developer运行它时,我得到以下屏幕。
它抱怨USER_ROW PL / SQL RECORD行无效但是SQL Developer生成了这个吗?
更新:
我使用以下代码进行测试。
DECLARE
USER_ROW t_user%rowtype;
BEGIN
--USER_ROW := ('BOB','MALAKI','sithlord@google.com');
USER_ROW.FIRST_NAME := 'BOB';
USER_ROW.LAST_NAME := 'MALAKI';
USER_ROW.EMAIL := 'MALIKI@power.com';
SP_USER_CREATE(
USER_ROW => USER_ROW
);
--rollback;
END;
问题仍然存在,但USER_ROW可以在一行中定义,而不是单独设置每一列吗?当有很多列时,这可能很乏味。
答案 0 :(得分:2)
“PL / SQL记录”只是实际数据类型的占位符,而不是数据类型本身,因为sql developer没有可靠的方法来使用数据字典来确定它。将其替换为“t_user%rowtype”,这是一种user_row参数。
答案 1 :(得分:1)
我对接受的答案有所补充。 可以使用select:
设置USER_ROWselect 'BOB' as FIRST_NAME, 'MALAKI' as LAST_NAME, 'MALIKI@power.com' as EMAIL
into USER_ROW from dual;
您还可以从另一个表格中选择USER_ROW中的值。
P.S .: 而且,而不是行:
INSERT INTO T_USER (FIRST_NAME,LAST_NAME,EMAIL)
VALUES(user_row.FIRST_NAME, user_row.LAST_NAME, user_row.EMAIL);
在存储过程中,您可以写:
INSERT INTO T_USER VALUES user_row;
您可以看到一些其他信息: Oracle: Insert rowtype data into another table