是我的程序的来源。
CREATE OR REPLACE procedure SYS.ChangePassword(
pUsername in varchar2,
pNewPassword in varchar2,
pResult out varchar2) as
**pragma autonomous_transaction;**
begin
insert into test_table values( to_date(sysdate), pUsername, pNewPassword);
**commit;**
execute immediate 'alter user '||pUsername||' identified by "'|| pNewPassword || '"';
pResult := 'New password for '|| pUsername||' has been set: '|| pNewPassword ;
exception
WHEN OTHERS THEN
pResult := SQLERRM;
end;
没什么特别的,它只是为用户设置了一个新密码。它按预期工作 - 返回有关新密码的信息
New password for TEST_user has been set: XSW1!WDC1
或返回错误消息
ORA-28003: password verification for the specified password failed
ORA-20004: Password should contain at least one digit, one character and one punctuation
当然,它会在测试表中添加一条记录。
关键是如何使用dblink从其他数据库调用此过程。 当我以下面的方式这样做时:
DECLARE
vResult varchar2(400);
BEGIN
ChangePassword@db23('TEST_USER','XS21345W1!WDC1',vResult );
commit;
DBMS_OUTPUT.PUT_LINE(vResult);
END;
它不返回任何错误,但既没有添加新的记录到表,也没有关于成功/错误的消息。
解决方案:在程序的乞讨时添加编译指示“改变子程序在事务中的工作方式”。