【发布时间】:2020-05-22 16:44:30
【问题描述】:
我正在尝试使用 sql*plus 从 shell 脚本调用一个过程,但我遇到了一个奇怪的问题。
我的过程首先将数据从表中加载到游标中。 然后,对于游标的每一行,它调用另一个应该将数据插入另一个表的过程。之后,它会更新从第一个表中读取的行以包含“工作完成”时间戳。
当我从 PL/SQL Developer 调用此过程时,一切正常,我将数据放入第二个表中。 当我从 sql*plus 调用相同的过程时,它告诉我一切正常(返回 0),添加了“工作完成”时间戳,但我没有将数据插入到第二个表中。
我不知道是什么原因造成的。
这是脚本中用于调用过程的行:
echo exit | sqlplus -S $schema @call_to_procedure.sql
$schema 是 schema/pwd@db
call_to_procedure.sql 是
set serveroutput on feedback off
declare
V_RETURN number(1);
begin
SCHEMA.PACKAGE.PROCEDURE(V_RETURN);
dbms_output.put_line(V_RETURN);
end;
/
这里是过程代码(希望我没有删除太多,但基本上没有的是光标的选择查询的过滤器)
PROCEDURE MYPROC (v_result out NUMBER) IS
v_id_smth number(10);
v_id_smthelse number(10);
v_data varchar2(10);
v_errmsg CLOB;
CURSOR data_to_load IS
SELECT t1.id_smth as id_smth, t1.data as data, t2.smthelse as smthelse
FROM t1, t2
WHERE t1.id_smth = t2.id_smth
AND other controls
;
BEGIN
FOR data in data_to_load
LOOP
v_id_smth := data.id_smth;
v_id_smthelse := data.id_smthelse;
v_data := data.data; -- sorry about that renaming scheme :/
BEGIN
INSERT_DATA_INTO_OTHER_TABLE(v_id_smth, v_id_smthelse, v_data);
END;
END LOOP;
UPDATE T1
SET date_processing = SYSDATE
WHERE date_processing IS NULL;
v_result = 0;
EXCEPTION
WHEN OTHER THEN
v_errmsg := SQLCODE || '-' || SQLERRM || '; v_id_smth : ' || v_id_smth || '; v_id_smthelse : ' || v_id_smthelse;
LOG_PACKAGE.LOG_PROC('MY_PROC', v_errmsg);
v_result := 1;
END MYPROC;
编辑澄清: 这两个过程都在同一个架构/包中,并且我在两个实例中都以架构所有者身份登录(PL Developper 和 sql*plus)。
【问题讨论】:
标签: bash oracle stored-procedures sqlplus