태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Oracle 성능 Troubleshooting을 위해 꼭 알아야 할 프로그래밍 지식 - SQL*Plus에서 인자 받기

오라클 2009.06.29 11:11
Oracle 성능 이상 현상이 발생했을 때 분석을 위해 다양한 작업을 수행하게 된다. 이런 작업을 할 때 반드시 알아야 할 프로그래밍 지식들이 있다. 반드시라고 하면 잘못된 표현일수도 있겠지만, 적어도 이 정도의 지식이 없이는 작업 속도가 크게 떨어지거나 제대로 된 분석을 하기가 어렵다는 정도로 이해하면 될 것이다.

가장 기본적인 중 하나가 SQL*Plus에서 인자(Parameter)를 주고 받는 방법이다. 이 방법을 잘 익히면 언뜻 복잡해 보이는 작업도 아주 쉽게 처리할 수 있는 경우가 많다.

SQL*Plus script를 호출할 때 다음과 같이 두 개의 인자를 주고 호출한다.

UKJA@ukja116> @test "logical reads" "name,class,value"
다음과 같이 다양한 방식으로 이 인자들을 이용할 수 있다.
select name, value from v$sysstat
where name like '%&1%';

NAME                                          VALUE                             
------------------------------ --------------------                             
session logical reads                     4,462,033                             


define __STATNAME = &1

select name, value from v$sysstat
where name like '%&__STATNAME%';

NAME                                          VALUE                             
------------------------------ --------------------                             
session logical reads                     4,462,033                             

define __COLUMNS = "&2"

select &__COLUMNS from v$sysstat
where name like '%&__STATNAME%';

NAME                                CLASS                VALUE                  
------------------------------ ---------- --------------------                  
session logical reads                   1            4,462,033                  
COLUMN 명령의 NEW_VALUE 옵션을 이용하면 SQL의 수행 결과의 특정 값을 SQL*Plus 치환 변수로 변환할 수 있다. 대단히 유용하고 멋진 방법이다.
col name new_value matching_name

select &__COLUMNS from v$sysstat
where name like '%&__STATNAME%';
NAME                                CLASS                VALUE                  
------------------------------ ---------- --------------------                  
session logical reads                   1            4,462,033                  

prompt matching_name

select &__COLUMNS from v$sysstat
where name = '&matching_name';

NAME                                CLASS                VALUE                  
------------------------------ ---------- --------------------                  
session logical reads                   1            4,462,033                  
Host 변수를 사용해서 PL/SQL과 연동해서 인자를 서로 주고 받을 수도 있다. 복잡한 Logic을 구현할 때 매우 유용하다.
var matching_name varchar2(100)

begin
	select name into :matching_name
	from v$sysstat
	where name like '%&__STATNAME%';
end;
/

print :matching_name

MATCHING_NAME                                                                   
--------------------------------------------------------------------------------
session logical reads                                                           
이 방법은 최고봉은 다음과 같이 Cursor 객체를 인자로 주고 받는 것이다.
var v_cursor refcursor;

declare
  v_sql   varchar2(4000);
begin
  
  v_sql := 'select &__COLUMNS from v$sysstat
  						where name = ''&matching_name''';

  open :v_cursor for v_sql;
  
end;
/

print :v_cursor;

NAME                                CLASS                VALUE                  
------------------------------ ---------- --------------------                  
session logical reads                   1            4,462,033                  

위의 간단한 기법들 중에서 특히 SQL*Plus Script를 호출할 때 인자를 얻는 방식과 COLUMN ... NEW_VALUE 명령을 이용해서 동적으로 인자를 받는 방식만은 반드시 몸에 철저하게 익혀야 한다. 이런 방법을 잘 활용하면 말 그대로 생활이 아름답고 편리해진다.
tags :
Trackback 0 : Comments 2
  1. oraking 2009.06.29 14:04 신고 Modify/Delete Reply

    accept 명령어까지 곁들이면 금상첨화겠죠.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    accept tname prompt '테이블명을 입력하세요. --> '

    select num_rows from user_tables where table_name = upper('&tname');

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  2. 욱짜 2009.06.30 11:25 신고 Modify/Delete Reply

    accept 명령은 SQL*Plus에서 interactive한 프로그램을 만들고 싶을 때 많이 사용되죠. "default" 옵션까지 같이 사용하면 더욱 편리하더라구요.

Write a comment

티스토리 툴바