簡體   English   中英

Oracle / PLSQL-使用列會生成where子句

[英]Oracle / PLSQL - Using column results in a where clause

我一直在嘗試做一些非常簡單的事情,但仍然做不到。 我正在嘗試遍歷一個表,並在where子句中使用列的每一行來顯示查詢。

例如:

我想從dba_users中檢索所有用戶,並將其傳遞給查詢中的where子句,以顯示每個用戶的例如account_status和配置文件。 但我想以某種方式做到這一點,以便可以將結果轉換成許多html表。

我確實嘗試了太多事情,所以我會發布一些無效的內容,但我認為這會顯示出我遇到的問題,

BEGIN
 FOR i IN (SELECT username from dba_users order by 1)
 LOOP
 EXECUTE IMMEDIATE 'select account_status from dba_users where username like ''||i.username||''';
 END LOOP;
 END;
 /

編輯:這是我想要實現的另一個示例:

  1. 從V $ SQL讀取2個SQL_ID

    SQL>從v $ sql選擇sql_id,其中rownum <3;

    SQL_ID

    9avfy3fv2wq2x
    0ywp98ffdz77f

  2. 使用這些返回的ID收集一些性能信息,並在兩個結果集中獲得結果

-HTML標記

set markup HTML ON HEAD " -  
" -  
BODY "" -  
TABLE "border='1' align='center' summary='Script output'" -  
SPOOL ON ENTMAP ON PREFORMAT OFF  

select sql_id, loads_total from dba_hist_sqlstat where sql_id like '9avfy3fv2wq2x';  
select sql_id, loads_total from dba_hist_sqlstat where sql_id like '0ywp98ffdz77f';  

我得到以下結果

SQL_ID        LOADS_TOTAL  
------------- -----------  
9avfy3fv2wq2x          21  

SQL_ID        LOADS_TOTAL  
------------- -----------  
0ywp98ffdz77f          12  

使用標記標簽,可以將其轉換為:

在此先感謝您的時間,

od

使用游標嘗試一下:

 DECLARE
    CURSOR USERS IS
      SELECT username FROM dba_users ;

 BEGIN

    FOR user in USER
    LOOP
       SELECT account_status FROM dba_users WHERE username = user;
    END LOOP;

 END; 

您可以使用一些臨時表來存儲每個選擇中的數據,然后可以對其進行進一步處理。

另一種選擇是使用您在循環中填充的TABLE TYPE OF xxx 您可以在稍后顯示結果的第二部分中看到如何使用它。

 DECLARE
    CURSOR USERS IS
      SELECT username FROM dba_users ;

    TYPE resultType IS TABLE OF NVARCHAR2(80) ;
    result resulttype := resulttype();

    indx NUMBER(10) :=0;
 BEGIN

  -- we insert data from some selects
  FOR user in USERs
    LOOP
        result.extend();
        indx := indx + 1 ;
       SELECT account_status into result(indx) FROM dba_users WHERE username = user.username;

    END LOOP;


  -- and now we will display content 
    FOR i IN result.FIRST .. result.LAST
   LOOP
       dbms_output.put_line(result(i));
  END LOOP;

 END; 

您與代碼並不遙遠。

declare
    v_account_status dba_users.account_status%type;
BEGIN
 FOR cur_users IN (SELECT username from dba_users order by 1)
 LOOP
   SELECT account_status INTO v_account_status -- you need to save somewhere 
                                               -- your value of account_status
          FROM dba_users 
          WHERE username LIKE cur_users.username; -- cur_users is the 
                                                  -- current row of dba_users
    -- do something with v_account_status, like
    -- htp.prn(cur_users.username || ' has account status ' || v_account_status);
 END LOOP;
END;

我相信您正在嘗試實現這種結果。 但是,這僅在您正在執行的動態查詢正在獲取單個結果時才有效。 如果動態查詢正在獲取多個結果,則可以使用集合類型的變量通過批量收集來存儲結果,然后循環瀏覽列表以顯示輸出。

    DECLARE
       v_sql         VARCHAR2 (4000);
       v_user_name   VARCHAR2 (400);
    BEGIN
       FOR i IN (SELECT   username
             FROM     dba_users
             WHERE    ROWNUM < 5
             ORDER BY 1) LOOP
          v_sql :=
            'select account_status from dba_users where username= '''
         || i.username
         || '''';

          EXECUTE IMMEDIATE v_sql
          INTO              v_user_name;

          DBMS_OUTPUT.put_line ('v_Sql:' || v_sql || ' v_user: ' || v_user_name);
       END LOOP;
    END;
    /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM