错误测试 PL/SQL 插入存储过程
Error Testing PL/SQL Insert Stored Proc
我是 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 开发人员 运行 它时,我得到以下屏幕。
它抱怨行 USER_ROW PL/SQL RECORD is not valid but SQL Developer generated this?
更新:
我通过使用以下代码进行测试使其正常工作。
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 可以在一行中定义而不是单独设置每一列吗?当有很多列时,这可能会很乏味。
"PL/SQL record" 只是实际数据类型的占位符,而不是数据类型本身,因为 sql 开发人员没有使用数据字典确定它的可靠方法。将其替换为 "t_user%rowtype",这是一种 user_row 参数。
我对已接受的答案有补充。
可以使用 select:
设置 USER_ROW
select 'BOB' as FIRST_NAME, 'MALAKI' as LAST_NAME, 'MALIKI@power.com' as EMAIL
into USER_ROW from dual;
您还可以将另一个 table 的值 select 转换为 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
我是 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 开发人员 运行 它时,我得到以下屏幕。
它抱怨行 USER_ROW PL/SQL RECORD is not valid but SQL Developer generated this?
更新:
我通过使用以下代码进行测试使其正常工作。
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 可以在一行中定义而不是单独设置每一列吗?当有很多列时,这可能会很乏味。
"PL/SQL record" 只是实际数据类型的占位符,而不是数据类型本身,因为 sql 开发人员没有使用数据字典确定它的可靠方法。将其替换为 "t_user%rowtype",这是一种 user_row 参数。
我对已接受的答案有补充。 可以使用 select:
设置 USER_ROWselect 'BOB' as FIRST_NAME, 'MALAKI' as LAST_NAME, 'MALIKI@power.com' as EMAIL
into USER_ROW from dual;
您还可以将另一个 table 的值 select 转换为 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