【问题标题】:Building a String Array in Pl/SQL For loop在 Pl/SQL For 循环中构建字符串数组
【发布时间】:2016-12-21 10:32:21
【问题描述】:

您好,我有一个字符串数组 (CompTblNameArry),我想根据光标内的选择查询在数据库中包含某些用户名。

代码如下:

DECLARE
  TYPE SegTblTyp IS TABLE OF mto_kgpr.pdtable_12%rowtype;
  TYPE TblNameStringArry IS TABLE OF varchar2(61) INDEX BY PLS_INTEGER;
  --Type TblNameStringArry is varray(100) of varchar2(61);
  LoopIteration pls_integer;

  CURSOR GetUserNamesCursor is
  SELECT username FROM DBA_USERS WHERE USERNAME LIKE 'MTO_K%';

  SegCollectionTbl SegTblTyp;
  --CompTblNameArry CompTblNameArryTyp;
  CompTblNameArry TblNameStringArry;

    BEGIN
       LoopIteration := 1;

        FOR Username in GetUserNamesCursor
        LOOP
          DBMS_OUTPUT.PUT_LINE('Iteration: ' || LoopIteration || ' username ' || Username.Username);
          -- Row Below is causing Error
          --CompTblNameArry(i) = Username.Username;
          LoopIteration := LoopIteration + 1;

        END LOOP;
    END;

填充 CompTblNameArry 的正确语法是什么?我尝试的方法不起作用:

CompTblNameArry(i) = 用户名.用户名;

谢谢, 帕特

【问题讨论】:

  • 语法是variableNameOfTableType(index).Column := Value。所以像CompTblNameArry(i).WhatEverTheColumnIsCalled := value。如果它是 varchar2 的简单类型,就像您正在使用它一样 variableNameOfTableType(index) := val,但您的 Username.Username 可能是这里问题的原因,而不是左侧
  • @KevinEsche Username.Username 对我来说看起来不错。认为右侧需要修复

标签: arrays string for-loop plsql


【解决方案1】:

您的代码几乎没有问题。 1) Fetch 丢失到集合中。 2) 循环变量错误。

见下文:

DECLARE
   TYPE SegTblTyp IS TABLE OF mto_kgpr.pdtable_12%ROWTYPE;

   TYPE TblNameStringArry IS TABLE OF VARCHAR2 (61)
      INDEX BY PLS_INTEGER;

   --Type TblNameStringArry is varray(100) of varchar2(61);
   LoopIteration      PLS_INTEGER;

   CURSOR GetUserNamesCursor
   IS
      SELECT username
        FROM DBA_USERS
       WHERE USERNAME LIKE 'MTO_K%';

   SegCollectionTbl   SegTblTyp;
   --CompTblNameArry CompTblNameArryTyp;
   CompTblNameArry    TblNameStringArry;
BEGIN
   LoopIteration := 1;

   --fetch records of cursor to collection 
   OPEN GetUserNamesCursor;
   FETCH GetUserNamesCursor BULK COLLECT INTO CompTblNameArry;
   CLOSE GetUserNamesCursor;

   FOR Username IN 1..CompTblNameArry.count
   LOOP
      DBMS_OUTPUT.PUT_LINE (
         'Iteration: ' || LoopIteration || ' username ' || CompTblNameArry(Username));
      -- Row Below is causing Error
      --CompTblNameArry(i) = Username.Username;
      LoopIteration := LoopIteration + 1;
   END LOOP;
END;

【讨论】:

    【解决方案2】:

    感谢大家的支持!

    我根据这个支持网站和互联网搜索找到了一个可行的解决方案。

    我最终只使用 PL/SQL 生成一个长的 union all 语句,然后我将 union all 语句从 dbms_output.put_line 复制到一个常规 sql 中,然后从那里运行它。当然我必须删除第一个联合,除了它运行完美!

    *** 开始 PL/SQL

    DECLARE
    
       TYPE SegTblTyp IS TABLE OF mto_kgpr.pdtable_12%ROWTYPE;
    
    
    
       TYPE TblNameStringArry IS TABLE OF VARCHAR2 (61)
    
          INDEX BY PLS_INTEGER;
    
    
    
      SqlStatement VARCHAR2(32767);
    
    
    
       --Type TblNameStringArry is varray(100) of varchar2(61);
    
       LoopIteration      PLS_INTEGER;
    
    
    
       CURSOR GetUserNamesCursor
    
       IS
    
          select OWNER from all_tables where table_name = 'PDTABLE_12';
    
    
    
       SegCollectionTbl   SegTblTyp;
    
       CompTblNameArry TblNameStringArry;
    
       UserNameArry    TblNameStringArry;
    
    BEGIN
    
       LoopIteration := 1;
    
    
    
       --fetch records of cursor to collection 
    
       OPEN GetUserNamesCursor;
    
       FETCH GetUserNamesCursor BULK COLLECT INTO UserNameArry;
    
       CLOSE GetUserNamesCursor;
    
    
    
       FOR Username IN 1..UserNameArry.count
    
       LOOP
    
        SqlStatement := SqlStatement || ' union all select ''' || UserNameArry(Username) || ''' as username, inst.instrument_comp_no, mdl.model_no, mdl.path_name, mdl.model_file_spec from pd' || substr(UserNameArry(Username),4) || '.pdtable_113 mdl, '|| UserNameArry(Username) ||'.pdtable_67 inst where instrument_comp_no like ''%-%V-%'' and inst.partition_no = mdl.partition_no';
    
          LoopIteration := LoopIteration + 1;
    
       END LOOP;
    
       DBMS_OUTPUT.PUT_LINE(SqlStatement);
    
    END;
    

    *** 结束 PL/SQL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多