如何使用不带参数的 oracle 存储过程在表中插入多行



我有一个表格:

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)

我需要一些帮助才能正常工作。提前谢谢。

参数定义不正确。参数模式(输入、输出、输入(必须遵循参数名称。

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

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

另请注意 - VARCHAR2优于 VARCHAR,因为 VARCHAR 的 Oracle 定义可能会在未来某个时候发生变化。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获取数据时,名称必须大写。在内部,甲骨文中的所有名称都大写,除非"引用"。

祝你好运。

最新更新