测试PL / SQL插入存储过程时出错

时间:2015-02-09 23:31:15

标签: oracle plsql oracle-sqldeveloper

我是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运行它时,我得到以下屏幕。

enter image description here

它抱怨USER_ROW PL / SQL RECORD行无效但是SQL Developer生成了这个吗?

enter image description here

更新:

我使用以下代码进行测试。

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可以在一行中定义,而不是单独设置每一列吗?当有很多列时,这可能很乏味。

2 个答案:

答案 0 :(得分:2)

“PL / SQL记录”只是实际数据类型的占位符,而不是数据类型本身,因为sql developer没有可靠的方法来使用数据字典来确定它。将其替换为“t_user%rowtype”,这是一种user_row参数。

答案 1 :(得分:1)

我对接受的答案有所补充。 可以使用select:

设置USER_ROW
select '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