T-SQL에서와 같이 PL/SQL에서 변수를 선언하고 사용하려면 어떻게 해야 하나요?

Sql Server에서는 저장 프로시저의 본문을 테스트할 때 종종 본문을 SSMS로 복사하고 페이지 상단에 변수를 선언한 다음 샘플 값으로 설정하고 본문을 그대로 실행합니다.

예를 들어, 내 프로시저가

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

그러면 내 테스트 SQL은 다음과 같습니다.

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

이에 상응하는 오라클 PL/SQL은 무엇인가요?

이것이 제가 생각해낸 가장 가까운 방법이지만, <PLS-00428: 이 SELECT 문에서 INTO 절이 예상됩니다>라는 메시지가 표시됩니다;

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

이것은 제가 실제로 수행하려는 작업을 더 잘 보여주는 예입니다:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

그러나 다시 말하지만, 실제로는 다른 테이블에 저장되지 않고 화면에 레코드가 인쇄되기를 원할 때 'INTO' 를 원합니다.....

해결되었습니다:

앨런 덕분에 충분히 잘 작동합니다. 오라클 SQL 개발자는 사용자가 제공 한 매개 변수 값을 분명히 기억합니다. 그러나 PL / SQL 개발자는 이것과 아무 관련이 없습니다....

'서비스 계정 스크립트'로 실행하면 기본값을 따르지만 그리드/스프레드시트가 아닌 ASCI 텍스트로만 결과를 반환합니다.

질문에 대한 의견 (6)
해결책

수정된 답변

다른 프로그램에서 이 코드를 호출하지 않는 경우 PL/SQL을 건너뛰고 바인드 변수를 사용하여 SQL에서 엄격하게 수행하는 옵션이 있습니다:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

많은 도구(예: Toad 및 SQL Developer)에서 varexec 문을 생략하면 프로그램에서 값을 입력하라는 메시지를 표시합니다.


원본 답변

T-SQL과 PL/SQL의 가장 큰 차이점은 오라클에서는 쿼리 결과를 암시적으로 반환할 수 없다는 것입니다. 결과는 항상 어떤 방식으로든 명시적으로 반환되어야 합니다. 가장 간단한 방법은 DBMS_OUTPUT(print와 거의 동일)을 사용하여 변수를 출력하는 것입니다:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

그러나 결과 집합을 반환하려는 경우 이 방법은 그다지 유용하지 않습니다. 이 경우 컬렉션이나 참조자를 반환하고 싶을 것입니다. 그러나 이러한 솔루션 중 하나를 사용하려면 코드를 함수나 프로시저로 래핑하고 결과를 소비할 수 있는 곳에서 함수/프로시저를 실행해야 합니다. 이러한 방식으로 작동하는 함수는 다음과 같이 보일 수 있습니다:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
해설 (6)

Oracle PL/SQL에서 여러 행을 반환할 수 있는 쿼리를 실행하는 경우 결과를 반복하려면 커서가 필요합니다. 가장 간단한 방법은 예를 들어 for 루프입니다:

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

정확히 하나의 행을 반환하는 쿼리가 있는 경우 select...into... 구문을 사용할 수 있습니다(예:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
해설 (0)