2014-01-22 21 views
0

我試圖執行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天以來,我一直在努力修復這個問題。請幫我解決這個問題。提前致謝。

+1

它在JRuby之外工作嗎? – echristopherson

+0

是的,我把它作爲一個單獨的plsql塊運行,並且工作正常。 – itsh

回答

0

ALTER SYSTEM KILL SESSION不會立即擺脫會話。它只是標誌着它被殺死。通常一個後臺進程將在一分鐘內擺脫它。如果有許多未提交的更改,則可能需要很長時間才能回滾所有內容。

沒有辦法加快這個過程。最好的做法是忽略那些帶有謂詞where v$session.status <> 'KILLED'的會話。

+0

我通過添加where子句來檢查狀態,從而更新了'ALTER SYSTEM KILL SESSION'。這次我收到以下SQL錯誤:'NativeException:java.sql.SQLException:ORA-00026:缺失或無效的會話ID ORA-06512:在行15'。我查看了每個用戶的狀態,並將其標記爲「KILLED」。我怎樣才能克服這個問題? – itsh

+0

將條件添加到遊標而不是「ALTER」。 –

+0

我試着添加下面的代碼:'CURSOR sess_cur IS IF(v $ session.status <>'KILLED')然後選擇sid,serial#從v $ session WHERE用戶名like('ABC'); END IF;'但它給出了以下錯誤:'NativeException:java.sql.SQLException:ORA-06550:line 5,column 12: PLS-00103:遇到下列其中一項時遇到符號「IF」:(select (SELECT語句)# – itsh

相關問題