2016-12-21 55 views
-1

你好,我有,我想基于游标内选择查询包含在数据库中的某些用户名字符串(CompTblNameArry)的阵列。建立一个字符串数组在PL/SQL For循环

代码如下所示:

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)= Username.Username;

感谢, 帕特

+1

的语法'variableNameOfTableType(指数).COLUMN:= Value'。 所以像'CompTblNameArry(i).WhatEverTheColumnIsCalled:= value'。如果it'sa简单类型varchar2'的',就像你正在使用it's'variableNameOfTableType(指数):= val',但你的'Username.Username'可能是问题的原因在这里,而不是lefthandside – SomeJavaGuy

+0

@KevinEsche 'Username.Username'对我来说看起来很好。想想右侧需要修复 – GurV

回答

2

有你的代码的几个问题。 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; 
+0

是完美的作品! – PatStarks

0

感谢所有为您的支持!

我发现了一个基于此支持网站和通过互联网搜索的工作解决方案。

我结束了刚刚使用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