【问题标题】:How to insert multiple rows in a table using oracle stored procedure without parameters如何使用不带参数的oracle存储过程在表中插入多行
【发布时间】:2018-05-20 12:16:58
【问题描述】:

我有一张桌子:

test_1(id int, f_name varchar(20),age int). 

我想使用存储过程用值填充此表。

(1,'josh',23),(2,'jack',34),(3,'liam',45). 

我知道如何使用简单的 SQL 来做到这一点,但想知道如何使用存储过程来做到这一点。我在下面使用了一个存储过程,但这不起作用并给了我一个错误。以下是错误及其下方的过程。存储过程已编译但有错误。

错误:PLS-00103:在预期以下之一时遇到符号“IN”:
<an identifier> <a double-quoted delimited-identifier>
当前删除存在于之前"

CREATE PROCEDURE insert_test_1(IN a_val int not null,IN b_val varchar(20),IN c_val int(2))
BEGIN
    INSERT INTO test_1
(id,f_name,age) VALUES (a_val ,b_val ,c_val);
END 

然后我尝试调用该过程,但它不起作用:

CALL insert_test_1(1,'josh',23)

我需要一些帮助才能让它工作。提前致谢。

【问题讨论】:

  • 您的程序无法编译。在它编译之前你不能运行它。您的标签说您正在使用 PLSQL Developer。您实际上是在使用 Allround Automations IDE 还是您认为该标签意味着更通用的东西?

标签: oracle procedure plsqldeveloper


【解决方案1】:

参数定义不正确。参数模式(IN、OUT、INOUT)必须跟在参数名后面。

您不能在参数定义上设置比例或精度 - 您只能指定基本类型(例如 INT、VARCHAR、NUMBER 等)。

您也不能对参数定义施加 NOT NULL 约束。

另请注意 - VARCHAR2 优于 VARCHAR,因为 Oracle 对 VARCHAR 的定义可能会在将来的某个时间更改。保证 VARCHAR2 的语义在未来不会改变。

因此,您应该使用

CREATE OR REPLACE PROCEDURE insert_test_1(a_val IN INT,
                                          b_val IN VARCHAR2,
                                          c_val IN INT) IS
BEGIN
  INSERT INTO test_1 (id,f_name,age) VALUES (a_val ,b_val ,c_val);
END;

如果编译中有错误,您可以通过从 ALL_ERRORS 视图中获取数据来检索它们,类似于:

SELECT *
  FROM ALL_ERRORS
  WHERE NAME = 'INSERT_TEST_1';

请注意,从 ALL_ERRORS 获取数据时,名称必须大写。在内部,Oracle 中的所有名称都是大写的,除非“引用”。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多