2017-06-08 13 views
-1
Declare 
      TYPE cur_type IS REF CURSOR; 
      v_owner varchar2(40); 
      v_table_name varchar2(40); 
      v_column_name varchar2(100); 
      ln_col_variable VARCHAR2(20000) := Null; 
      sql_fetch  VARCHAR2(30000) := Null; 
      l_xmltype XMLTYPE; 
      col_var varchar2(2000); 

       enquiry_cur cur_type; 

       /* First cursor */ 
        CURSOR get_tables IS 
        SELECT DISTINCT tbl.table_name 
        FROM user_tab_columns tbl 
        WHERE tbl.column_name='ENQUIRY_NO'; 

       /* Second cursor */ 
         CURSOR get_columns IS 
         SELECT DISTINCT col.column_name 
         FROM user_tab_columns col 
          -- WHERE col.owner = v_owner 
         WHERE col.table_name = v_table_name; 

        BEGIN 
         dbms_output.enable(1000000); 
        -- Open first cursor 
          OPEN get_tables; 

        LOOP 
       FETCH get_tables INTO v_table_name; 
       exit when get_tables%notfound; 
       DBMS_OUTPUT.PUT_LINE(v_table_name); 
       dbms_output.put_line('----------------------'); 


         -- Open second cursor 
        OPEN get_columns; 
        LOOP 
       FETCH get_columns INTO v_column_name; 
       exit when get_columns%notfound; 
       dbms_output.put_line(v_column_name); 
       ln_col_variable :=ln_col_variable||','||v_column_name; 

       col_var:=replace(substr(ln_col_variable,1,1),',','*'); 


       --dbms_output.put_line(col_var); 
       /* Loop 
     ln_col_variable :=ln_col_variable||','||v_column_name; 


         End Loop;*/ 
     -- ln_col_variable :=ln_col_variable||sysdate; 
     -- sql_fetch  := 'Select '||ln_col_variable||'   From '||v_table_name; 
      -- dbms_output.put_line(sql_fetch); 
          END LOOP; 
       sql_fetch := 'Select '||col_var||' From '||v_table_name; 

      OPEN enquiry_cur FOR sql_fetch ; 


        l_xmltype := XMLTYPE(enquiry_cur); 
       dbms_output.put_line(l_xmltype.getClobVal); 
        CLOSE get_columns; 

    END LOOP; 

    CLOSE get_tables; 

     EXCEPTION 
      WHEN OTHERS THEN raise_application_error(-20001,'An    encountered '||SQLCODE||'  -ERROR- '||SQLERRM); 
        end ; 

74行目でPlsqlの数値または値のエラーが発生しました。 sql_fetch文字列のxml出力を取得したいutl_filesを使用しましたが、xml出力を取得できませんでした。テーブルは動的にしか認識されません。テーブル構造もコンパイル時に知られています以下のコードでPLSQL数値または値エラーが発生する

答えて

2

コードにはいくつかの誤りがあります。実際のエラーを解決するには、それを修正する必要があります。カーソルget_columnsはパラメータ化されており、値を渡すことはありません。以下を参照してください:

DECLARE 
    TYPE cur_type IS REF CURSOR; 

    v_owner   VARCHAR2 (40); 
    v_table_name  VARCHAR2 (40); 
    v_column_name  VARCHAR2 (100); 
    ln_col_variable VARCHAR2 (20000) := NULL; 
    sql_fetch   VARCHAR2 (30000) := NULL; 
    l_xmltype   XMLTYPE; 
    col_var   VARCHAR2 (2000); 

    enquiry_cur  cur_type; 

    /* First cursor */ 
    CURSOR get_tables 
    IS 
     SELECT DISTINCT tbl.table_name 
     FROM user_tab_columns tbl 
     WHERE tbl.column_name = 'COL1'; 

    /* Second cursor */ 
    CURSOR get_columns(v_table_name varchar) 
    IS 
     SELECT DISTINCT col.column_name 
     FROM user_tab_columns col 
     -- WHERE col.owner = v_owner 
     WHERE col.table_name = v_table_name; --<--using a variable here 
BEGIN 
    --DBMS_OUTPUT.enable (1000000); 

    -- Open first cursor 
    OPEN get_tables; 

    LOOP 
     FETCH get_tables INTO v_table_name; 

     EXIT WHEN get_tables%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE (v_table_name); 
     DBMS_OUTPUT.put_line ('----------------------'); 


     -- Open second cursor 
     OPEN get_columns(v_table_name); --<--You need to pass parameter to cursor 

     LOOP 

     FETCH get_columns INTO v_column_name; 

     EXIT WHEN get_columns%NOTFOUND; 
     DBMS_OUTPUT.put_line (v_column_name); 
     ln_col_variable := ln_col_variable || ',' || v_column_name; 

     col_var := REPLACE (SUBSTR (ln_col_variable, 1, 1), ',', '*'); 
     --dbms_output.put_line(col_var); 
     /* Loop 
      ln_col_variable :=ln_col_variable||','||v_column_name; 


      End Loop;*/ 
     -- ln_col_variable :=ln_col_variable||sysdate; 
     -- sql_fetch  := 'Select '||ln_col_variable||'   From '||v_table_name; 
     -- dbms_output.put_line(sql_fetch); 
     END LOOP; 

     sql_fetch := 'Select ' || col_var || ' From ' || v_table_name; 

     OPEN enquiry_cur FOR sql_fetch; 


     l_xmltype := XMLTYPE (enquiry_cur); 

     DBMS_OUTPUT.put_line (l_xmltype.getClobVal); 

     CLOSE get_columns; 
    END LOOP; 

    CLOSE get_tables; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     raise_application_error (
     -20001, 
      'An    encountered ' 
     || SQLCODE 
     || '  -ERROR- ' 
     || SQLERRM); 
END; 

コードが修正されたら、あなたはカーソルget_tablesに言及しているすべてのテーブルがあなたがPL/SQL: numeric or value errorを取得する他に、少なくとも1行を持つべきであることを確認する必要があります。

出力:

SQL> set serverout on 
SQL>/
TABL1 
---------------------- 
COL1 
<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <COL1>1</COL1> 
</ROW> 
<ROW> 

<COL1>2</COL1> 
</ROW> 
<ROW> 
    <COL1>A</COL1> 
</ROW> 
<ROW> 
    <COL1>B2</COL1> 

</ROW> 
</ROWSET> 

TABL2 
---------------------- 
COL1 
<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <COL1>1</COL1> 
</ROW> 
</ROWSET> 
+0

私は.IN上の宣言セクションカーソルget_columnsをコードをチェックしてきたように私の2番目のカーソルがパラメータ化されていないが、USER_TAB_COLUMNS COL は異なるcol.column_name を選択 IS - WHERE col.owner = v_owner WHERE col.table_name = v_table_name; 私はパラメータ化されたカーソルを使用していません – Alka

+0

以下の実行可能なセクションでコードOPEN get_columnsです。 ループ \t FETCH get_columns INTO v_column_name; \t終了時にget_columns%notfound; \t dbms_output.put_line(v_column_name); – Alka

+0

@Alka。私はパラメータ化されたcusorが何であるかを理解する必要があると思います。どのようにしてoracleがこの 'WHERE col.table_name = v_table_name;'から 'v_table_name'の値を理解しなければなりませんか?投稿したコードを読んでください。そのうまく動作します。ちょうど私が述べたことに従います。 – XING

関連する問題