programing

T-SQL에서처럼 PL/SQL에서 변수를 선언하고 사용하는 방법은 무엇입니까?

fastcode 2023. 3. 1. 13:46
반응형

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

이에 해당하는 Oracle PL/SQL은 무엇입니까?

지금까지 나온 것 중 가장 비슷하지만 "PLS-00428: 이 SELECT 문에 INT 절이 필요합니다"라고 표시됩니다.

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'가 필요합니다.

해결:

@Allan 덕분에 충분히 잘 작동합니다.Oracle SQL Developer는 사용자가 제공하는 매개 변수 값을 기억하는 것 같습니다.그러나 PL/SQL Developer는 이 문제에 관여하고 싶지 않습니다.

여기에 이미지 설명 입력

[스크립트로 실행(Run As Script)]를 선택하면 기본값이 적용되지만 결과는 그리드/스프레드시트가 아닌 ASCI 텍스트로만 반환됩니다.

여기에 이미지 설명 입력

수정된 답변

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

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

Toad 및 SQL Developer와 같은 많은 도구에서var그리고.exec스테이트먼트를 지정하면 프로그램에서는 값을 입력하도록 요구됩니다.


원답

T-SQL과 PL/SQL의 큰 차이점은 Oracle이 쿼리의 결과를 암묵적으로 반환하지 못하도록 한다는 것입니다.결과는 항상 어떤 식으로든 명시적으로 반환되어야 합니다.가장 간단한 방법은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;

오라클 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;

행을 "1" 을 할 수 .select...into...「 」, 「 」:

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

변수는 정의되지 않고 선언됩니다.

는 pl/sql 블록에서 선언 변수가 중복될 수 있습니다.

그러나 여기를 참조해 주세요.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm

갱신:

참조: 다이내믹 SQL을 실행하는 Oracle PL/SQL 익명 블록에서 결과 집합/커서를 반환하는 방법

언급URL : https://stackoverflow.com/questions/10886568/how-do-i-declare-and-use-variables-in-pl-sql-like-i-do-in-t-sql

반응형