2014-11-27 2 views
1

У меня есть таблица attribute_config с ниже столбцами:Динамически назначая переменные Oracle SQL

table_name column_name ключ

Допустим, есть имеет менее 2 строк

счет accountphone AccountNum

CUSTOMERNUMBER клиента CustomerID

Ключ может быть только accountnum или customerid.

Мне нужно написать код, который примет (i_accountnum, i_customerid) и;

извлекать соответствующие значения из столбцов, указанных в имени столбца в таблицах, указанных в имени_таблицы, с использованием ключа, в котором указано условие.

Для бывших: выберите accountphone со счета, где AccountNum = i_accountnum выберите CustomerNumber от клиента, где CustomerID = i_customerid

полный запрос должен быть сформирован динамически, передавать ли i_accountnum или i_customerid в запросе также должно быть принято решение динамически. если key - accountnum, i_accountnum будет передан туда, где условие.

Я пробовал эти строки до сих пор, это не работает, я знаю, что это неправильно.

declare 
v_accountnum varchar2(20); 
v_customerid varchar2(20); 
v_attribute_value varchar2(20); 
v_stmt varchar2(255); 
begin 
Account_Num := 'TestCustomer'; -- input to the function 
v_customer_ref := 'TestAccount'; -- input to the function 
for i in (Select * from attribute_config) loop 
v_stmt := 'select ' || i.column_name || ' from ' || i.table_name ||' where ' || i.key|| ' = v_' || i.key; 
execute immediate v_Stmt into v_attribute_value; 
end loop; 
end; 

ответ

0

Это будет исправить ваш код, но я не вижу каких-либо преимуществ использования динамического запроса, когда ваш код должен принимать 2 параметра (i_accountnum, i_customerid) - что уже статическое положение и получать соответствующие значения, возможно только в учебных целях.

declare 
    procedure fecth_values(i_accountnum account.accountnum%type, 
          i_customerid customer.customerid%type) return varchar2 is 
     v_attribute_value varchar2(20); 
    begin 
     for i in (select * from attribute_config) loop 
     execute immediate 'select ' || i.column_name || ' from ' || 
          i.table_name || ' where ' || i.key || ' = ' || case when i.key = 'accountnum' then i_accountnum when i.key = 'customerid' then i_customerid end; 
     into v_attribute_value; 
     dbms_output.put_line(v_attribute_value); 
     end loop; 
     return null; 
    end; 
begin 
    fecth_values(1, 1); 
end; 

Ваш где положение было неправильным i.key следует сравнить с значениями, занесено не является 'v_' || i.key, который является необъявленным при выполнении вашего STMT.

+0

То, что я пытаюсь достичь, - это динамически подготовить ключ для условия. – user2503883

+0

В будущем может быть другой ключ, например productid, тогда этот ключ будет настроен в таблице и где условие должно выполняться «где i_productid =». О функции, принимающей 2 параметра, хотя она принимает 2 параметра, для запроса таблиц, всегда будет использоваться один параметр, и я хочу динамически решить (используя i.key), какой параметр использовать. i_accountnum или i_customerid на данный момент, может быть i_productid в будущем. Не аргумент case, как мы можем определить параметр с помощью самой i_key и передать его динамическому sql? – user2503883

+0

Измените свой подход. Выполните функцию, которая получит «имя таблицы» и «значение ключа». Сопоставьте соответствующее имя столбца и извлечение параметра из таблицы сопоставления с помощью параметра «имя таблицы» и верните это значение. Вызовите эту функцию 2 раза, 3 раза, сколько нужно. – mikron

Смежные вопросы