0

感谢您花时间阅读并回答我的问题!请注意,我是初学者,不应被视为专业人士,但我确实在没有找到答案的情况下搜索了答案,这可能是由于我不常见的问题和/或缺乏相关知识。

我在工作中遇到以下问题,我知道它不应该发生,但它就在我的办公桌上......:

我有一个包含以下列的表(conv_temp1):

ID No Sigle Info COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 COLUMN_5 .. COLUMN_50

我有这个光标:

 CURSOR c_minis IS
        SELECT *
        FROM conv_temp1;

我正在尝试执行以下操作:

FOR v_rsrec IN c_minis LOOP
   l_column_i := 1;
   dbms_output.put_line('----- Beginning - v_rsrec.id ----');
     FOR boucle IN REVERSE 1.. 50 LOOP

       --this is my problem, i am trying to acces a cursor column "dynamically"
       EXECUTE IMMEDIATE 'v_declared_varchar2 := COLUMN_'|| l_column_i ||';';  

       IF v_declared_varchar2 IS NOT NULL THEN
         dbms_output.put_line('I am doing something with the information!');
         --(Dont worry, YES I am re-structuring it in a new table...)


       END IF;
       l_column_i := l_column_i + 1;
     END LOOP;
   dbms_output.put_line('-----c end - v_rsrec.id ----');
END LOOP;

有没有办法根据我在迭代中的位置来执行访问不同列(只有这些列的名称中的数字发生变化)之类的事情?例如,如果我已经完成了 10 次迭代,我将从光标中的 COLUMN_11 中恢复信息。

4

2 回答 2

1

更好的解决方案是规范化表格。将其分为两个表:

CREATE TABLE CONV_TEMP_HEADER
  (ID_NO        NUMBER
     CONSTRAINT PK_CONV_TEMP_HEADER
       PRIMARY KEY
       USING INDEX,
   SIGLE_INFO   VARCHAR2(100));  -- or whatever

CREATE TABLE CONV_TEMP_DETAIL
  (ID_DETAIL    NUMBER,
   ID_NO        NUMBER
     CONSTRAINT CONV_TEMP_DETAIL_FK1
       REFERENCES CONV_TEMP_HEADER(ID_NO)
         ON DELETE CASCADE,
   IDX          NUMBER,
   COLUMN_VALUE VARCHAR2(100)
   CONSTRAINT CONV_TEMP_DETAIL_UQ1
     UNIQUE(ID_NO, IDX));

这样,您不必动态生成列名并弄清楚如何使用 DBMS_SQL,而是可以使用简单的连接获取数据:

SELECT h.*, d.*
  FROM CONV_TEMP_HEADER h
  LEFT OUTER JOIN CONV_TEMP_DETAIL d
    ON d.ID_NO = h.ID_NO;

分享和享受。

于 2015-01-06T22:48:25.500 回答
0

对于其他具有基本知识和相同需求的人,这是我的解决方案:

CREATE OR REPLACE VIEW temp_view_name AS
SELECT ROWNUM AS ind, t.* FROM (
   SELECT DISTINCT m.*
   FROM conv_temp1 m ) t ;

这应该可以在没有游标时从 EXECUTE IMMEDIATE 查询访问。

于 2015-01-07T16:41:09.267 回答