【问题标题】:how can we get the value of of VARRAY from IN Parameter in procedure我们如何从过程中的 IN 参数中获取 VARRAY 的值
【发布时间】:2013-07-30 14:56:18
【问题描述】:

我是 PL/SQL 的新手...在 Varray 中我如何从 IN 参数中获取多个值.....否则是否有其他方法来获取值...

我想通过 VArray 对值进行交互...如果有任何其他选项,那很好.. 编码:

CREATE OR REPLACE
PROCEDURE dynamic_query_build(
    vr_plan_sku_id IN VARCHAR2 )
IS
type plan_sku_id_array IS VARRAY(999) OF VARCHAR2(5000);
plan_sku_id plan_sku_id_array;
total           INTEGER;
vrx_plan_sku_id VARCHAR2(3000);
BEGIN
  vrx_plan_sku_id:= REPLACE(vr_plan_sku_id,',',chr(39)||','||chr(39));
  plan_sku_id    := plan_sku_id_array(chr(39)||vrx_plan_sku_id||chr(39));
  total          := plan_sku_id.count;
  FOR i          IN 1 .. total
  LOOP
    dbms_output.put_line(plan_sku_id(i));
  END LOOP;
EXCEPTION
WHEN OTHERS THEN
  raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END dynamic_query_build;

执行:

set serveroutput on;
declare
vr_plan_sku_id varchar2(200) := '5863314,5863315';
BEGIN
   dynamic_query_build(vr_plan_sku_id);
END;
/

我的输出:

anonymous block completed
'5863314','5863315'

预期输出:

5863314
5863315

现在它被认为是单一值....

【问题讨论】:

    标签: sql oracle plsql oracle10g plsqldeveloper


    【解决方案1】:

    我使用过程 dynamic_query_build 创建了匿名块。在那里添加了代码,它将 VARCHAR2 变量拆分为 vararray。 我认为,您问题的关键是这一行 - plan_sku_id.EXTEND(); 您可以动态扩展 varray,但只能达到定义的最大值(在您的情况下为 999)。

    DECLARE
    vr_plan_sku_id varchar2(200) := '5863314,5863315';
    PROCEDURE dynamic_query_build(
        vr_plan_sku_id IN VARCHAR2 )
    IS
    type plan_sku_id_array IS VARRAY(999) OF VARCHAR2(5000);
    plan_sku_id plan_sku_id_array;
    total           INTEGER;
    
    position PLS_INTEGER := 0;
    last_position PLS_INTEGER := 1;
    tmp VARCHAR2(5000);
    counter PLS_INTEGER := 1;
    BEGIN
      plan_sku_id := plan_sku_id_array();
      LOOP
        position := INSTR(vr_plan_sku_id, ',', last_position);
        IF position > 0 THEN
          tmp := SUBSTR(vr_plan_sku_id, last_position, position - last_position);
          last_position := position + 1;
        ELSE
          tmp := SUBSTR(vr_plan_sku_id, last_position);
        END IF;
        plan_sku_id.EXTEND();
        plan_sku_id(counter) := tmp;
        counter := counter + 1;
        EXIT WHEN position = 0 OR counter > 10;
      END LOOP;
      total          := plan_sku_id.count;
      FOR i          IN 1 .. total
      LOOP
        dbms_output.put_line(plan_sku_id(i));
      END LOOP;
    EXCEPTION
    WHEN OTHERS THEN
      raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
    END dynamic_query_build;
    BEGIN
       dynamic_query_build(vr_plan_sku_id);
    END;
    /
    

    【讨论】:

      【解决方案2】:

      在 dbms_output 语句中进行替换,这将消除字符串中的引号

           ....
           dbms_output.put_line replace (replace (plan_sku_id(i), '''' ))',',chr(10);
           .....
      

      【讨论】:

      • 嗨 Harshit -- 我希望在数组中使用如下所示的值.. plan_sku_id := plan_sku_id_array(vr_plan_sku_id);我想从 Varray 迭代值
      • @user2582602 您正在打印上述修改将执行的值
      • 我尝试了这种情况,所以我已经通过了我尝试过的查询...是否可以在执行时间为 VARRAY 提供输入?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2012-07-26
      相关资源
      最近更新 更多