Как повторно использовать переменную в качестве имени таблицы в запросе выбора - PullRequest
2 голосов
/ 25 октября 2019

Мне нужно получить идентификатор из таблицы, имя таблицы которой определяется путем выполнения другого запроса.

Я попытался реализовать его, определив переменную, которая сохраняет результаты первого запроса. Затем я создал второй запрос, который использует имя таблицы из первого.

define tablename = (SELECT table_name FROM tables_names WHERE row_id = 147);
define rowid = SELECT row_id FROM &tablename WHERE title is NULL;
select * from &rowid;

Однако он не работает. Я также пытался создать хранимую процедуру, но я не понимаю, как она должна работать:

DECLARE 
    tablename varchar(128);
    rowid int;
BEGIN
    SELECT table_name INTO tablename FROM tables_names WHERE row_id = 147);
    SELECT row_id INTO rowid FROM &tablename WHERE title is NULL;
END;

Вывод должен дать мне ожидаемый rowid. Я не эксперт по Oracle, и это кажется простой вещью, но я не знаю, как этого добиться.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Используйте execute immediate следующим образом:

DECLARE 
    rowid_ int; -- dont use oracle reserved words as variable name. 
    -- added _ after rowid
BEGIN
    EXECUTE IMMEDIATE 'SELECT row_id FROM ' 
    ||  (SELECT table_name FROM tables_names WHERE row_id = 147) 
    || ' WHERE title is NULL' INTO ROWID_;
-- do something with rowid_ or other logic
END;
/

Ура !!

0 голосов
/ 25 октября 2019

Это называется динамическим sql. Отредактируйте процедуру и сделайте так:

EXECUTE IMMEDIATE 
"SELECT row_id INTO :x FROM " || tablename || " WHERE title IS NULL" 
USING rowid;

Это из памяти, поэтому она может не работать, но должна дать вам хорошее представление о том, как это сделать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...