2013-09-09 3 views
0

У меня есть функция plsql, где я впервые получаю имя поля другой таблицы в инструкции select. Теперь я хочу получить значение поля этой другой таблицы.Использование содержимого переменных в предложении select

В переменной fieldName указано имя поля таблицы, в которой я нуждаюсь.

То, что я пытался до сих пор:

SELECT fieldName FROM prj WHERE ID = 12345 

Но я правильно получаю сообщение об ошибке, что имя_поля не существует. Как это сделать?

ТИА frgtv10

+0

Этот вопрос может быть несколько более простым. Не могли бы вы отправить точное сообщение об ошибке, которое вы получаете при запуске 'SELECT fieldName FROM prj WHERE ID = 12345'? – bpgergo

+0

@bpgergo, «fieldName» в качестве столбца не существует. Здесь должно стоять содержимое переменной, вот и проблема. – frgtv10

ответ

2

Попробуйте использовать EXECUTE IMMEDIATE ниже

DECLARE 
    sql_stmt VARCHAR2(200); 
    id   NUMBER(8) := 12345; 
    colval  VARCHAR2(200); 
    fieldName VARCHAR2(200) := 'columnname'; 
BEGIN 
    sql_stmt := 'SELECT '||fieldName||' FROM prj WHERE id = :id'; 
    EXECUTE IMMEDIATE sql_stmt INTO colval USING id; 
END; 
1

Существует другой, более правильный подход для такого случая. Это не самая лучшая идея для динамического выбора столбца из таблицы. Для него должен быть отдельный оператор SELECT.

CREATE TABLE test 
(
    col1 NUMBER 
, col2 NUMBER 
); 

INSERT INTO test VALUES (11, 12); 

DECLARE 
    l_field_name VARCHAR2(30); 
    l_selected VARCHAR2(30); 

    FUNCTION col_name RETURN VARCHAR2 
    AS 
    BEGIN 
     RETURN 'col1'; 
    END col_name; 
BEGIN 
    l_field_name := col_name(); 

    IF l_field_name = 'col1' THEN 
     SELECT col1 
     INTO l_selected 
     FROM test; 
    ELSIF l_field_name = 'col2' THEN 
     SELECT col2 
     INTO l_selected 
     FROM test; 
    ELSE 
     RAISE_APPLICATION_ERROR(-20000, 'Column does not exist'); 
    END IF; 
END; 
Смежные вопросы