блок plsql для получения результата динамического запроса sql - PullRequest
0 голосов
/ 31 августа 2009

мы создали следующий анонимный блок ...........

DECLARE
   sql_str long(32000);
   where_str long(32000);
   counter NUMBER(3):=0;
   BEGIN
   sql_str:='SELECT '||' A.bio_id ,';
   where_str:=' where '||'A.bio_id=B.bio_id AND'||' A.bio_id<>0 and rownum<25 AND (' ;
   LOOP
   counter:=counter+1;
  sql_str:=sql_str||'decode(A.wk_units'||(counter+1)||' - B.wk_units'|| (counter)||',0,NULL,A.wk_units'||(counter+1)||')';
 sql_str:=sql_str||', decode(A.wk_units'||(counter+1)||' - B.wk_units'|| (counter)||',0,NULL,B.wk_units'||(counter)||')' ;
  where_str:=where_str||' A.wk_units'||(counter+1)||'<> B.wk_units'||(counter) ;
  EXIT WHEN counter=5;
  sql_str:=sql_str||', ';
  where_str:=where_str||' or ';
  END LOOP;
  sql_str:=sql_str||' from cnt_sls_dm.fct_sales_summary A, cnt_sls_dm.fct_sales_summary B';
  sql_str:=sql_str||where_str||')';
  dbms_output.put_line(sql_str);
  EXECUTE IMMEDIATE(sql_str);
  END;

Необходимый результат: Мы написали динамический SQL-запрос. Он должен получить результирующий набор запроса select. Но мы получаем запрос при запуске этого блока. вместо того, чтобы получить какой-либо результат для этого запроса.

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

результат

SQL> /
SELECT  A.bio_id ,decode(A.wk_units2 - B.wk_units1,0,NULL,A.wk_units2),
decode(A.wk_units2 - B.wk_units1,0,NULL,B.wk_units1), decode(A.wk_units3 -
B.wk_units2,0,NULL,A.wk_units3), decode(A.wk_units3 -
B.wk_units2,0,NULL,B.wk_units2), decode(A.wk_units4 -
B.wk_units3,0,NULL,A.wk_units4), decode(A.wk_units4 -
B.wk_units3,0,NULL,B.wk_units3), decode(A.wk_units5 -
B.wk_units4,0,NULL,A.wk_units5), decode(A.wk_units5 -
B.wk_units4,0,NULL,B.wk_units4), decode(A.wk_units6 -
B.wk_units5,0,NULL,A.wk_units6), decode(A.wk_units6 -
B.wk_units5,0,NULL,B.wk_units5) from cnt_sls_dm.fct_sales_summary A,
cnt_sls_dm.fct_sales_summary B where A.bio_id=B.bio_id AND A.bio_id<>0 and
rownum<25 AND ( A.wk_units2<> B.wk_units1 or  A.wk_units3<> B.wk_units2 or
A.wk_units4<> B.wk_units3 or  A.wk_units5<> B.wk_units4 or  A.wk_units6<>
B.wk_units5)

PL/SQL procedure successfully completed.

Ответы [ 3 ]

2 голосов
/ 31 августа 2009

Это:

dbms_output.put_line(sql_str);

... это то, что печатает вывод, что является правильным поведением. Часть DECLARE создает впечатление, что вы пытаетесь запустить анонимную функцию, верно?

Я никогда не использовал EXECUTE НЕМЕДЛЕННО - только следующее:

FUNCTION MY_FUNCTION()
RETURN SYS_REFCURSOR

L_CURSOR SYS_REFCURSOR;
L_QUERY  VARCHAR2(5000) DEFAULT 'SELECT ...';

BEGIN

  OPEN L_CURSOR FOR L_QUERY;
  RETURN L_CURSOR;

END;

Если вы хотите включить переменные связывания в динамический SQL:

FUNCTION MY_FUNCTION()
RETURN SYS_REFCURSOR

L_CURSOR SYS_REFCURSOR;
L_QUERY  VARCHAR2(5000) DEFAULT 'SELECT ...';

BEGIN

  OPEN L_CURSOR FOR L_QUERY
   USING bind_var1;
  RETURN L_CURSOR;

END;
1 голос
/ 31 августа 2009

Если бы вы выполняли это как жестко закодированный оператор в блоке, он бы не работал с PLS-00428, потому что вы не выбираете переменную.

EXECUTE IMMEDIATE не дает сбоя, потому что он работает в пространстве SQL. Но если вы хотите получить набор результатов, вам все равно придется передать его в локальную переменную.

SQL> declare
  2      n number;
  3  begin
  4      execute immediate 'select sum(sal) from emp';
  5      dbms_output.put_line('sum of salaries = '||n);
  6  end;
  7  /
sum of salaries =

PL/SQL procedure successfully completed.

SQL> declare
  2      n number;
  3  begin
  4      execute immediate 'select sum(sal) from emp' into n;
  5      dbms_output.put_line('sum of salaries = '||n);
  6  end;
  7  /
sum of salaries = 48525

PL/SQL procedure successfully completed.

SQL>

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

Кстати, есть ли конкретная причина, по которой вы используете динамический SQL для этого запроса?

0 голосов
/ 31 августа 2009

Для меня неясно, чего хочет Ирвин:

@ Irveen, почему не таблица с 105 записями? Каждую неделю вы сбрасываете одну запись и добавляете другую. Вам никогда не придется менять свой запрос.

Другим решением является смещение ваших данных, поэтому вы помещаете данные столбца 2 в 1, 3 в 2, 4 в 3, ..., 103 в 102. Вам никогда не придется добавлять столбец и удалять столбец ,

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