2012-12-01 4 views
0

Может ли любой орган, пожалуйста, помочь? Я получаю ниже ошибки для кода.Нужна помощь для отладки кода

ОРА-06550: строка 20, столбец 33:

PLS-00306: неправильное число или типы аргументов в вызове к '||'

ORA-06550: строка 20, столбец 12:

PL/SQL: Заявление игнорировали

... Condition1: если я ставлю значение явно в моем параметризующих курсор, то он не достигает до 2 ДЛЯ петля. и после печати выполняется оператор «Внутри». Условие2. Если я поместил переменную как параметр, то она даст вышеупомянутую ошибку.

DECLARE 
/* First cursor */ 
    CURSOR get_tables IS 
    SELECT DISTINCT * FROM src_table_list tbl ; 
/* Second cursor */ 
    CURSOR get_columns(v_table_name varchar2) IS 
    SELECT SUBSTR (SYS_CONNECT_BY_PATH (column_name, ','), 2) csv 
     FROM (SELECT column_name , ROW_NUMBER() OVER (ORDER BY column_name) rn, 
       COUNT (*) OVER() cnt 
      FROM USER_TAB_COLUMNS where table_name = v_table_name) 
    WHERE rn = cnt 
    -- and col.sn = v_sn 
    START WITH rn = 1 
    CONNECT BY rn = PRIOR rn + 1; 

BEGIN 
FOR i IN get_tables LOOP 
dbms_output.put_line('Inside '); 
    FOR j IN get_columns(i.table_name) LOOP 
     dbms_output.put_line('SELECT '|| j ||'FROM'||i.table_name||' ;'); 
     dbms_output.put_line(' '); 
    END LOOP; 
END LOOP; 
END; 
/

ответ

2

Вы пытаетесь Concat j на выходе, но J является ссылкой на строку в курсоре. Это тип, который не может быть неявно передан в строку, так что concat терпит неудачу.

вероятно Вы имели в виду, чтобы написать

dbms_output.put_line('SELECT '|| j.csv || ' FROM ' || i.table_name || ';'); 

PS. что вы делаете с этим подключением? Нужно ли получать значения, разделенные запятыми? Возможно, вы можете использовать LISTAGG, or my custom variant of it.

+0

Возможно, второй запрос неверен. Вы пробовали это самостоятельно, передавая фиксированное имя таблицы? Больше нет синтаксической ошибки, но я не могу точно сказать, что вы хотите вернуть. См. Вопрос + предложение в последней строке моего ответа. – GolezTrol

+0

Симптомы ясны, поэтому, пожалуйста, внимательно прочитайте: * Строка не игнорируется, но второй курсор просто не возвращает никаких строк. * Просто попробуйте написать его как запрос, что значительно упрощает тестирование и отладку. После этого вы можете вернуть его в эту процедуру. – GolezTrol

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