【问题标题】:provide Select statement in procedure parameter在过程参数中提供 Select 语句
【发布时间】:2020-11-19 18:40:32
【问题描述】:

您好,我正在 oracle 中处理此查询,我需要为表中的过程提供许多 id。我如何将表中的每个 id 提供给我的程序。抱歉,我对此有点陌生,我完全迷路了,我不知道要搜索什么。 这里是

程序

 PROCEDURE procedname(in_id in VARCHAR2)

select id from mytable

这是我尝试过的

 execute procedname(select id from mytable);

但没有工作

有没有办法做到这一点? 希望有人帮我解决这个问题

【问题讨论】:

  • 该过程是一次采用一个 ID 还是一个 ID 列表?

标签: oracle stored-procedures plsql oracle11g


【解决方案1】:

您可以传递一组数字。这是一个如何通过的示例。

--sys.odcinumberlist is a collection which can hold numbers..

create procedure sp_test(i_id in sys.odcinumberlist)
as
l_cnt int;
begin
 select count(*)
   into l_cnt
   from TABLE(i_id); /* the TABLE keyword is used to unfold the collection of numbers as rows..*/
   dbms_output.put_line(l_cnt);
end;
/

--调用存储过程

begin
  dbms_output.enable;
  sp_test(sys.odcinumberlist(1,2,3,4,5,6)); /* here i am passing a list of numbers from 1 to 6*/
  --the procedure will count the number of elements in the input collection which is 6 
end;
/

【讨论】:

    【解决方案2】:

    您不能直接将 SQL 语句用作过程或函数的参数。因为这需要一个INTO 子句才能返回 SELECT 语句的内容。您的案例建议使用 CURSOR,因为需要一次返回所有记录。为此,使用SYS_REFCURSOR 作为IN/OUT(或只是OUT)类型参数的可能示例解决方案将是;

    SQL> CREATE TABLE mytable( id VARCHAR2(1) );
    SQL> INSERT INTO mytable VALUES('A');
    SQL> INSERT INTO mytable VALUES('B');
    
    SQL> CREATE OR REPLACE PROCEDURE Convert_ID(p_myrecordset IN OUT SYS_REFCURSOR) AS 
    BEGIN 
      OPEN p_myrecordset FOR
        SELECT id, ASCII( id )
          FROM mytable
         ORDER BY id;    
    END;
    /
    
    SQL> SET SERVEROUTPUT ON;
    SQL> DECLARE
      l_cursor  SYS_REFCURSOR;
      l_value1  mytable.id%TYPE;
      l_value2  INT;
    BEGIN
    
      Convert_ID(p_myrecordset => l_cursor);            
                
      LOOP 
        FETCH l_cursor
        INTO  l_value1, l_value2;
        EXIT WHEN l_cursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(l_value1 || ' - ' || l_value2 );
      END LOOP;
      CLOSE l_cursor;
    END;
    /
    
    A - 65
    B - 66
    

    Demo

    【讨论】:

      【解决方案3】:

      要从some table 获取每个id 并调用sometable(id),PL/SQL 循环将是这样的:

      begin
          for r in (
              select id from sometable
          )
          loop
              procedname(r.id);
          end loop;
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多