如何从游标动态恢复 columnName_N,N 是在循环中递增的数字?
How can I dynamically recover columnName_N from a cursor, N being a number incremented in a LOOP?
感谢您花时间阅读并回答我的问题!
请注意,我是初学者,不应该被视为专业人士,但我确实搜索了答案但没有找到它,可能是由于我的不常见问题 and/or 缺乏相关知识。
我在工作中遇到以下问题,我知道这不是真的应该发生,但它就在我的办公桌上...:[=4=]
我有一个包含以下列的 table (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 恢复信息。
更好的解决方案是规范化 table。将其分成两个 table 为:
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;
分享和享受。
对于其他具有基本知识和相同需求的人,这是我的解决方案:
CREATE OR REPLACE VIEW temp_view_name AS
SELECT ROWNUM AS ind, t.* FROM (
SELECT DISTINCT m.*
FROM conv_temp1 m ) t ;
这应该可以在没有游标的情况下通过 EXECUTE IMMEDIATE 查询访问。
感谢您花时间阅读并回答我的问题! 请注意,我是初学者,不应该被视为专业人士,但我确实搜索了答案但没有找到它,可能是由于我的不常见问题 and/or 缺乏相关知识。
我在工作中遇到以下问题,我知道这不是真的应该发生,但它就在我的办公桌上...:[=4=]
我有一个包含以下列的 table (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 恢复信息。
更好的解决方案是规范化 table。将其分成两个 table 为:
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;
分享和享受。
对于其他具有基本知识和相同需求的人,这是我的解决方案:
CREATE OR REPLACE VIEW temp_view_name AS
SELECT ROWNUM AS ind, t.* FROM (
SELECT DISTINCT m.*
FROM conv_temp1 m ) t ;
这应该可以在没有游标的情况下通过 EXECUTE IMMEDIATE 查询访问。