본문 바로가기

Database/PL SQL

PL/SQL Tutorial - SELECT INTO

SELECT 구조

SELECT
  select_list
INTO
  variable_list
FROM
  table_name
WHERE
  condition; 

WHERE과 같이 INNER JOIN, GROUP BY, HAVING, UNION을 사용할 수 있다.

예전에 작성한 EXAMPLE 데이터베이스로 예제를 실행해보자.

DECLARE
  v_customer_name customers.name%TYPE;
BEGIN
  SELECT
    name
  INTO
    v_customer_name
  FROM
    customers
  WHERE
    customer_id = 100;
 
  DBMS_OUTPUT.PUT_LINE( v_customer_name );
END;

익명 블록이 완료되었습니다.
Verizon

1. v_customer_name 은 customers.name의 type으로 정의해준다.

2. customer_id = 100 인 애를 뽑아준다

3. 이를 출력해준다.

맞는지 의심하며 확인해본다.

SELECT name
FROM customers
WHERE customer_id = 100;

Verizon

column 단위가 아닌 row 단위로 뽑아본다.

DECLARE
  l_customer customers%ROWTYPE;
BEGIN
  SELECT
    *
  INTO
    l_customer
  FROM
    customers
  WHERE
    customer_id = 100;
 
  DBMS_OUTPUT.PUT_LINE( l_customer.name || ', website: ' ||
  l_customer.website );
END; 

익명 블록이 완료되었습니다.
Verizon, website: http://www.verizon.com

일반적인 SELECT문으로 뽑아내면 이런 모양이다.

하지만 PL/SQL은 보고 싶은 부분만 output으로 출력할 수 있기 때문에 저러한 결과가 나타나는 것이다.

서로 다른 column에서 뽑아본다.

DECLARE
  v_customer_name customers.name%TYPE;
  v_contact_first_name contacts.first_name%TYPE;
  v_contact_last_name contacts.last_name%TYPE;
BEGIN
  SELECT
    name, first_name, last_name
  INTO
    v_customer_name, v_contact_first_name, v_contact_last_name
  FROM
    customers
  INNER JOIN contacts USING( customer_id )
  WHERE
    customer_id = 100;
 
  DBMS_OUTPUT.PUT_LINE( v_customer_name || ', Contact Person: ' ||
  v_contact_first_name || ' ' || v_contact_last_name );
END; 

익명 블록이 완료되었습니다.
Verizon, Contact Person: Elisha Lloyd

DECLARE 부분에서 보다시피 customers와 contacts 테이블에서 SELECT 해오는 것을 알 수 있다. 이후 INNER JOIN 해준다.

한 번 살펴보자.

SELECT customers.name, contacts.first_name, contacts.last_name
FROM customers
INNER JOIN contacts ON customers.CUSTOMER_ID = contacts.CONTACT_ID
WHERE customers.CUSTOMER_ID = 100;

그냥 INNER JOIN 해준다면 이런 쿼리가 될 것이다. 결과는 테이블 형식으로 나온다.

하지만 PL/SQL을 사용하면 원하는 형식으로 출력할 수 있다.

ORA-00947: not enough values    The INTO list contains fewer variables than the SELECT list.
ORA-00913: too many values    The INTO list contains more variables than the SELECT list.
ORA-06502: PL/SQL: numeric or value error

rkwudhsms value가 적합하지 않으면 error가 난다. 가져오는 value의 개수가 적합해도 자료형이 맞지 않으면 error가 난다.

'Database > PL SQL' 카테고리의 다른 글

PL/SQL Tutorial - Cursor FOR LOOP  (0) 2019.05.08
PL/SQL Tutorial - Cursor  (0) 2019.05.08
PL/SQL Tutorial - Exception handlers  (0) 2019.05.08
PL/SQL Tutorial - CONTINUE  (0) 2019.05.08
PL/SQL Tutorial - LOOP  (0) 2019.05.08