oracle查询选择一个列(列名未知)

时间:2016-03-13 09:40:25

标签: oracle plsql

我的列名是从另一个查询中检索的,然后使用该结果作为我想要查询的列名来获取值。我找到了一个重复的问题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。

2 个答案:

答案 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;