我的列名是从另一个查询中检索的,然后使用该结果作为我想要查询的列名来获取值。我找到了一个重复的问题here,但我找不到答案。所以我的代码看起来像这样:
DECLARE
COL_NO NUMBER(3,0);
COL_NAME VARCHAR2(30);
COL_VALUE VARCHAR2(100);
BEGIN
COL_NO:=0;
COL_NAME:=NULL;
COL_VALUE:=NULL;
SELECT COUNT(*) INTO COL_NO FROM user_tab_columns WHERE table_name='SALARYSLIP';
FOR A IN 4..COL_NO LOOP
SELECT column_name INTO COL_NAME FROM user_tab_columns WHERE column_id=A AND table_name='SALARYSLIP';
--SELECT COL_NAME INTO COL_VALUE FROM SALARYSLIP WHERE ID=SALARYSLIP.ID;
DBMS_OUTPUT.PUT_LINE(COL_VALUE);
END LOOP;
END;
评论的查询应该获取列值,但显然不起作用。我应该在那里写什么? TIA。
答案 0 :(得分:0)
我不确定你想要完成什么。计算表中的列数并从4迭代到该数字似乎不太合乎逻辑。在所需的SQL语句中,您还不清楚要获取要使用的id
的值。
如果要在运行时确定列名,则需要使用动态SQL。像
这样的东西FOR A IN 4..COL_NO LOOP
SELECT column_name INTO COL_NAME FROM user_tab_columns WHERE column_id=A AND table_name='SALARYSLIP';
--SELECT COL_NAME INTO COL_VALUE FROM SALARYSLIP WHERE ID=SALARYSLIP.ID;
EXECUTE IMMEDIATE 'SELECT ' || col_name ||
' FROM salaryslip ' ||
' WHERE id = :1'
INTO col_value
USING <<whatever ID value you want>>;
DBMS_OUTPUT.PUT_LINE(COL_VALUE);
END LOOP;
为简单起见,我没有为动态执行之前汇编的SQL语句使用局部变量。通常,您可能希望在SQL语句中使用局部变量,这样您就可以执行一些操作,例如记录已汇编的语句,以防它没有达到预期的效果。
答案 1 :(得分:0)
我认为逻辑需要首先解决 - 即所需结果是否与SALARYSLIP表中的行或SALARYSLIP表的列有关。
SELECT COUNT(*)INTO COL_NO FROM user_tab_columns WHERE table_name ='SALARYSLIP'; (这将获得SALARYSLIP表中的列数) 在此之后,基于SALARYSLIP表上的列数,迭代for循环的期望结果是什么?通常,因为输出是基于被检索的行。
“ID”值来自何处?它没有在代码中初始化/声明。
从我收集的内容中,需要在运行时检索表的column_name。然后,应该为SALARYSLIP表显示该列的数据。
试试这个: 宣布 COL_NO NUMBER(3,0); COL_NAME VARCHAR2(30); COL_VALUE VARCHAR2(100); ROWNO NUMBER(3,0); 开始 COL_NO:= 0; COL_NAME:= NULL; COL_VALUE:= NULL;
SELECT COUNT(*) INTO COL_NO FROM user_tab_columns WHERE table_name='SALARYSLIP'; --number of columns in SALARYSLIP
SELECT Count(*) INTO rownno FROM SALARYSLIP; --number of rows in SALARYSLIP
--go through each column
FOR A IN 1..COL_NO LOOP
SELECT column_name INTO COL_NAME FROM user_tab_columns WHERE column_id=A AND table_name='SALARYSLIP'; --column_name
--go through each row in the SALARYSLIP table
--for each row, get the specific column of the row, and print this column's value
FOR B IN 1..rowno LOOP
SELECT COL_NAME INTO COL_VALUE FROM SALARYSLIP WHERE =SALARYSLIP.COL_NAME = COL_NAME;
DBMS_OUTPUT.PUT_LINE(COL_VALUE);
END LOOP;
END LOOP;
END;