plsql block to get the dynamic sql query result

半城伤御伤魂 提交于 2019-12-08 11:03:14

问题


we have created following anonymous block...........

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;

Result needed: We have written a dynamic sql query. It should get the result set of select query. But we are getting the query itself on running this block. rather than getting any result for this query.

Let us know are we on the rite track. Or we need to do something else to get the result out.

the result is

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.

回答1:


For me it is unclear what Irveen wants to achieve:

@Irveen, Why not a table with 105 records? Every week you drop one record and you add enother one. You will have never to change your query.

Another solution is to shift your data, so you put the data of column 2 into 1, 3 into 2, 4 into 3, ..., 103 into 102. You will never have to add a column and drop a column.




回答2:


This:

dbms_output.put_line(sql_str);

...is what is printing the output, which is correct behavior. The DECLARE portion gives me the impression you are attempting to run an anonymous function, correct?

I've never used EXECUTE IMMEDIATELY - only the following:

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;

If you want to include bind variables in the dynamic 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;



回答3:


If you were running this as a hardcoded statement in a block it would fail with PLS-00428 because you are not selecting into a variable.

The EXECUTE IMMEDIATE doesn't fail because it runs in the SQL space. But if you want to get the result set you will still have to pass it into a local variable.

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>

Which type of variable you choose depends upon what you want to do with the retrieved data, and whether the resultset is a single row or many.

Incidentally is there a particular reason why you are using dynamic SQL for this query?



来源:https://stackoverflow.com/questions/1356074/plsql-block-to-get-the-dynamic-sql-query-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!