PL / SQL 블록에서 SELECT 문을 출력 할 수 있습니까?
PL / SQL 블록을 사용 SELECT
하여 일반 작업을 수행 한 것과 동일한 방식으로 명령문의 결과를 출력하려면 SELECT
어떻게해야합니까?
예를 들어 SELECT
같은 작업을 수행하는 방법 :
SELECT foo, bar FROM foobar;
힌트 :
BEGIN
SELECT foo, bar FROM foobar;
END;
작동하지 않습니다.
결과가 필요한 것에 따라 다릅니다.
행이 1 개만있을 것이라고 확신하는 경우 암시 적 커서를 사용합니다.
DECLARE
v_foo foobar.foo%TYPE;
v_bar foobar.bar%TYPE;
BEGIN
SELECT foo,bar FROM foobar INTO v_foo, v_bar;
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar);
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- No rows selected, insert your exception handler here
WHEN TOO_MANY_ROWS THEN
-- More than 1 row seleced, insert your exception handler here
END;
둘 이상의 행을 선택하려면 명시 적 커서를 사용할 수 있습니다.
DECLARE
CURSOR cur_foobar IS
SELECT foo, bar FROM foobar;
v_foo foobar.foo%TYPE;
v_bar foobar.bar%TYPE;
BEGIN
-- Open the cursor and loop through the records
OPEN cur_foobar;
LOOP
FETCH cur_foobar INTO v_foo, v_bar;
EXIT WHEN cur_foobar%NOTFOUND;
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar);
END LOOP;
CLOSE cur_foobar;
END;
또는 다른 유형의 커서를 사용하십시오.
BEGIN
-- Open the cursor and loop through the records
FOR v_rec IN (SELECT foo, bar FROM foobar) LOOP
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_rec.foo || ', bar=' || v_rec.bar);
END LOOP;
END;
Oracle 12.1 이상에서이 작업을 수행 할 수 있습니다.
declare
rc sys_refcursor;
begin
open rc for select * from dual;
dbms_sql.return_result(rc);
end;
테스트 할 DBVisualizer가 없지만 그게 시작점 일 것입니다.
자세한 내용은 Oracle 12.1 New Features Guide , Oracle Base 등의 암시 적 결과 집합을 참조하십시오 .
이전 버전의 경우 도구에 따라 SQL * Plus에서 다음 예제와 같은 참조 커서 바인드 변수를 사용할 수 있습니다.
set autoprint on
var rc refcursor
begin
open :rc for select count(*) from dual;
end;
/
PL/SQL procedure successfully completed.
COUNT(*)
----------
1
1 row selected.
익명의 블록에서? 서브 쿼리 팩토링 절과 인라인 뷰를 사용하면 가장 복잡한 상황이 아닌 다른 상황에서 PL / SQL에 의존해야하는 경우가 매우 드물기 때문에 이것이 필요하다고 생각하는 상황에 대해 더 자세히 알아보고 싶습니다.
명명 된 프로 시저를 사용할 수 있으면 파이프 라인 함수를 사용하십시오. 다음은 문서에서 가져온 예입니다.
CREATE PACKAGE pkg1 AS
TYPE numset_t IS TABLE OF NUMBER;
FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED;
END pkg1;
/
CREATE PACKAGE BODY pkg1 AS
-- FUNCTION f1 returns a collection of elements (1,2,3,... x)
FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS
BEGIN
FOR i IN 1..x LOOP
PIPE ROW(i);
END LOOP;
RETURN;
END;
END pkg1;
/
-- pipelined function is used in FROM clause of SELECT statement
SELECT * FROM TABLE(pkg1.f1(5));
패키지에 함수를 만들고 SYS_REFCURSOR를 반환합니다.
FUNCTION Function1 return SYS_REFCURSOR IS
l_cursor SYS_REFCURSOR;
BEGIN
open l_cursor for SELECT foo,bar FROM foobar;
return l_cursor;
END Function1;
고전적인 "Hello World!" 블록에는 DBMS_OUTPUT.PUT_LINE
화면에 텍스트를 표시 하는 프로 시저를 호출하는 실행 가능한 섹션이 있습니다.
BEGIN
DBMS_OUTPUT.put_line ('Hello World!');
END;
여기에서 확인할 수 있습니다 : http://www.oracle.com/technetwork/issue-archive/2011/11-mar/o21plsql-242570.html
if you want see select query output in pl/sql you need to use a explicit cursor. Which will hold active data set and by fetching each row at a time it will show all the record from active data set as long as it fetches record from data set by iterating in loop. This data will not be generated in tabular format this result will be in plain text format. Hope this will be helpful. For any other query you may ask....
set serveroutput on;
declare
cursor c1 is
select foo, bar from foobar;
begin
for i in c1 loop
dbms_output.put_line(i.foo || ' ' || i.bar);
end loop;
end;
For versions below 12c, the plain answer is NO, at least not in the manner it is being done is SQL Server.
You can print the results, you can insert the results into tables, you can return the results as cursors from within function/procedure or return a row set from function -
but you cannot execute SELECT statement, without doing something with the results.
SQL Server
begin
select 1+1
select 2+2
select 3+3
end
/* 3 result sets returned */
Oracle
SQL> begin
2 select 1+1 from dual;
3 end;
4 /
select * from dual;
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00428: an INTO clause is expected in this SELECT statement
You need to use Native dynamic SQL. Also, you do not need BEGIN-END to run SQL command:
declare
l_tabname VARCHAR2(100) := 'dual';
l_val1 VARCHAR2(100):= '''foo''';
l_val2 VARCHAR2(100):= '''bar''';
l_sql VARCHAR2(1000);
begin
l_sql:= 'SELECT '||l_val1||','||l_val2||' FROM '||l_tabname;
execute immediate l_sql;
dbms_output.put_line(l_sql);
end;
/
Output:
SELECT 'foo','bar' FROM dual
use execute immediate statement
like:
declare
var1 integer;
var2 varchar2(200)
begin
execute immediate 'select emp_id,emp_name from emp'
into var1,var2;
dbms_output.put_line(var1 || var2);
end;
Even if the question is old but i will share the solution that answers perfectly the question :
SET SERVEROUTPUT ON;
DECLARE
RC SYS_REFCURSOR;
Result1 varchar2(25);
Result2 varchar2(25);
BEGIN
OPEN RC FOR SELECT foo, bar into Result1, Result2 FROM foobar;
DBMS_SQL.RETURN_RESULT(RC);
END;
Cursors are used when your select query returns multiple rows. So, rather using cursor in case when you want aggregates or single rowdata you could use a procedure/function without cursor as well like
Create Procedure sample(id
varchar2(20))as
Select count(*) into x from table
where
Userid=id;
End ;
And then simply call the procedure
Begin
sample(20);
End
This is the actual use of procedure/function mostly wrapping and storing queries that are complex or that requires repeated manipulation with same logic but different data
'Programing' 카테고리의 다른 글
Mapbox GL JS와 Mapbox.js (0) | 2020.12.12 |
---|---|
RxJS 맵 연산자 (각도)에서 오류를 발생시키는 방법 (0) | 2020.12.12 |
DateTimePicker에 빈 문자열을 표시하려면 어떻게해야합니까? (0) | 2020.12.12 |
Rails 프로젝트를위한 gem Forking (0) | 2020.12.12 |
$ (window) .height () 대 $ (document) .height (0) | 2020.12.11 |