我試圖執行plsql塊,其中有ALTER USER,然後是ALTER SYSTEM語句。 ALTER USER正在執行,但ALTER SYSTEM不是。ALTER SYSTEM未在jruby中執行
我的代碼執行以下操作: 1.使用jdbc驅動程序連接到數據庫。 2.更改特定用戶的登錄用戶(這裏我使用的是ALTER USER語句)。 3.在刪除特定用戶的會話之前(這裏我使用ALTER SYSTEM語句不運行)。
下面是我沒有運行的代碼片段。
users = ['ABC', 'XYZ']
$users.each do|x|
if(is_usr?("#{x}"))
puts "Working on #{x}"
stmt = <<-EOF
DECLARE
id NUMber(10);
s_num NUMBER(10);
CURSOR cur IS
SELECT sid, serial#
FROM v$session WHERE username like ('#{x}');
BEGIN
OPEN cur;
LOOP
FETCH cur INTO id, s_num;
dbms_output.put_line(id||' '||s_num);
EXECUTE IMMEDIATE 'ALTER USER #{x} IDENTIFIED BY dummypass';
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
EXIT when sess_cur%notfound;
END LOOP;
CLOSE cur;
END;
EOF
puts "#{stmt}"
plsql = @conn.create_statement
plsql.execute_update(stmt)
else
puts "#{x} does not exist"
end
end
輸出看起來是這樣的:
Working on ABC
DECLARE
id NUMber(10);
s_num NUMBER(10);
CURSOR cur IS
SELECT sid, serial#
FROM v$session WHERE username like ('ABC');
BEGIN
OPEN cur;
LOOP
FETCH cur INTO id, s_num;
dbms_output.put_line(id||' '||s_num);
EXECUTE IMMEDIATE 'ALTER USER ABC IDENTIFIED BY dummypass';
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
EXIT when sess_cur%notfound;
END LOOP;
CLOSE cur;
END;
Working on XYZ
DECLARE
id NUMber(10);
s_num NUMBER(10);
CURSOR cur IS
SELECT sid, serial#
FROM v$session WHERE username like ('XYZ');
BEGIN
OPEN cur;
LOOP
FETCH cur INTO id, s_num;
dbms_output.put_line(id||' '||s_num);
EXECUTE IMMEDIATE 'ALTER USER XYZ IDENTIFIED BY dummypass';
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
EXIT when sess_cur%notfound;
END LOOP;
CLOSE cur;
END;
觀察運行此腳本後: 1.我能夠登錄到數據庫爲ABC和XYZ與 'dummypass' 作爲密碼。因此我知道ALTER USER語句已成功運行。 2.我仍然可以看到'ABC'和'XYZ'的所有會話ID和序列號。因此我知道ALTER SYSTEM語句沒有運行。
自從過去3天以來,我一直在努力修復這個問題。請幫我解決這個問題。提前致謝。
它在JRuby之外工作嗎? – echristopherson
是的,我把它作爲一個單獨的plsql塊運行,並且工作正常。 – itsh