Oracle / PLSQL - 使用列结果在where子句中

时间:2016-01-07 16:05:43

标签: sql oracle plsql

我一直在尝试做一些非常简单的事情,但仍然做不到。 我试图在表上进行交互,并使用where子句中列的每一行来显示查询。

例如:

我想从dba_users中检索所有用户,将其传递给查询中的where子句,以显示每个用户的account_status和profile。但我想以某种方式这样做,所以我可以将结果转换成许多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来收集一些性能信息并将结果输入两个结果集

  3. - 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  
    

    使用标记标记,转换为:

    Example

    提前感谢您的时间,

    OD

4 个答案:

答案 0 :(得分:0)

使用游标尝试:

 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; 

答案 1 :(得分:0)

您可以使用一些临时表来存储每个选择的数据,然后您可以进一步处理它。

另一个选项是使用您在循环中填充的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; 

答案 2 :(得分:0)

你的代码并不遥远。

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;

答案 3 :(得分:0)

我相信你试图实现这种结果。但是,只有在您执行的动态查询获取单个结果时,这才有效。如果您的动态查询正在获取多个结果,您可以使用集合类型的变量来使用批量收集来存储结果,然后循环遍历列表以显示输出。

    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;
    /