我有一个表格:
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获取数据时,名称必须大写。在内部,甲骨文中的所有名称都大写,除非"引用"。
祝你好运。