2015-07-20 2 views
-2

Я написал одну процедуру SQL, где я написал один курсор, и каждый раз, когда мне приходится динамически передавать имя таблицы в запрос курсора.Как передать табличное имя PL PLUS курсору динамически?

create or replace 
PROCEDURE Add_DEN as 


v_TableName VARCHAR2(4000) := 'BO_USER_DATA'; 

cursor c_DEN is select * from BO_USER_DATA; // Want to pass dynamically ,now hardcoded 
r_DEN c_DEN%ROWTYPE; 

fetch c_DEN into r_DEN; 
v_Name := r_DEN."Name"; 

Могу ли я написать что-то вроде этого

cursor c_DEN is "select * from " || v_TableName; 

помощь?

+1

Вы уверены, что вы добавили этот вопрос правильно? Потому что ни один из 'create or replace',' varchar2', ': =' и '% ROWTYPE' не работает в SQL Server. –

+2

Пример кода не T-SQL – CPMunich

+0

Вам действительно нужен курсор? Есть несколько раз, когда нужно использовать курсор, но они очень часто используются, когда нет необходимости в одном. Почти в любое время, когда вы делаете DML, вам не нужен курсор. –

ответ

0

Основным ответом является «да», вы можете и, учитывая ваш пример, я бы рекомендовал вам использовать execute немедленно, чтобы выполнить произвольную строку SQL и связать переменные. Я бы все же пересмотрел, если вам действительно нужно динамически устанавливать таблицу, поскольку это не очень часто необходимо.

Пример:

DECLARE 
    sql_stmt VARCHAR2(200); 
    emp_id  NUMBER(4) := 7566; 
    emp_rec  emp%ROWTYPE; 
BEGIN 
    sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; 
    EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; 
END; 
1

вот пример:

declare 
    TYPE curtype IS REF CURSOR; 
    l_cursor curtype; 
    l_param number; 
    l_key number; 
    l_value number; 
    l_sql varchar2(200); 
begin 
    /* build your sql... */ 
    l_sql := 'with data as (select 1 key, 100 value from dual union select 2, 200 from dual union select 3, 300 from dual union select 3, 301 from dual)' || 
     ' select key, value from data where key = :1'; 
    l_param := 3; 

    open l_cursor for l_sql 
    using l_param; 

    loop 
    fetch l_cursor 
     into l_key, l_value; 
    exit when l_cursor%notfound; 

    dbms_output.put_line(l_key||' = '||l_value); 
    end loop; 
    close l_cursor; 
end; 

Результат:

3 = 300

3 = 301