Oracle PL/SQL/PL SQL/Case

Материал из SQL эксперт
Версия от 12:59, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Case conditions

   <source lang="sql">

set echo on; set verify off; set define "&"; prompt "Input degree (numerically in degrees F)?:"; / accept temp default "100"; / declare

 too_hot  exception;
 too_cold exception;

begin

 case
   when "&temp" < 90.00 then raise too_cold;
   when "&temp" > 140.00 then raise too_hot;
   else null;
 end case;
 dbms_output.put_line("The temperature is just right");

exception

 when VALUE_ERROR then
   dbms_output.put_line("Please enter a numeric temperature (like 100)");
 when too_hot then
   dbms_output.put_line("The porridge is way too hot...");
 when too_cold then
   dbms_output.put_line("The porridge is way too cold...");

end; /


 </source>
   
  


CASE not found while executing CASE statement

   <source lang="sql">
 

SQL> DECLARE

 2    v_TestVar NUMBER := 1;
 3  BEGIN
 4    CASE v_TestVar
 5      WHEN 2 THEN DBMS_OUTPUT.PUT_LINE("Two!");
 6      WHEN 3 THEN DBMS_OUTPUT.PUT_LINE("Three!");
 7      WHEN 4 THEN DBMS_OUTPUT.PUT_LINE("Four!");
 8    END CASE;
 9  END;
10  /

DECLARE

ERROR at line 1: ORA-06592: CASE not found while executing CASE statement ORA-06512: at line 4

SQL> SQL>

 </source>
   
  


CASE WHEN statement with variable

   <source lang="sql">
 

SQL> SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> select * from lecturer;

     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Scott Lawson Computer Science 11.00
                2. Mar Wells History 4.00
                3. Jone Bliss Computer Science 8.00
                4. Man Kyte Economics 8.00
                5. Pat Poll History 4.00
                6. Tim Viper History 4.00
                7. Barbara Blues Economics 7.00
                8. David Large Music 4.00
                9. Chris Elegant Nutrition 8.00
                10. Rose Bond Music 7.00
                11. Rita Johnson Nutrition 8.00
     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Sharon Clear Computer Science 3.00

12 rows selected. SQL> DECLARE

 2    v_Major lecturer.major%TYPE;
 3    v_CourseName VARCHAR2(10);
 4  BEGIN
 5    SELECT major
 6      INTO v_Major
 7      FROM lecturer
 8      WHERE ID = 10011;
 9
10    CASE v_Major
11      WHEN "Computer Science" THEN
12        v_CourseName := "CS  101";
13      WHEN "Economics" THEN
14        v_CourseName :="ECN 203";
15      WHEN "History" THEN
16        v_CourseName := "HIS 101";
17      WHEN "Music" THEN
18        v_CourseName := "MUS 100";
19      WHEN "Nutrition" THEN
20        v_CourseName := "NUT 307";
21      ELSE
22        v_CourseName := "Unknown";
23    END CASE;
24
25    DBMS_OUTPUT.PUT_LINE(v_CourseName);
26  END;
27  /

NUT 307 PL/SQL procedure successfully completed. SQL> SQL> drop table lecturer; Table dropped.

 </source>
   
  


CASE WHEN with comparison operator

   <source lang="sql">
 

SQL> SQL> DECLARE

 2    v_Test1 NUMBER := 2;
 3    v_Test2 VARCHAR2(20) := "Goodbye";
 4  BEGIN
 5    CASE
 6      WHEN v_Test1 = 1 THEN
 7        DBMS_OUTPUT.PUT_LINE("One!");
 8        DBMS_OUTPUT.PUT_LINE("Another one!");
 9      WHEN v_Test1 > 1 THEN
10        DBMS_OUTPUT.PUT_LINE("> 1!");
11        DBMS_OUTPUT.PUT_LINE("Still > 1!");
12      WHEN v_Test2 = "Goodbye" THEN
13        DBMS_OUTPUT.PUT_LINE("Goodbye!");
14        DBMS_OUTPUT.PUT_LINE("Adios!");
15      ELSE
16        DBMS_OUTPUT.PUT_LINE("No match");
17    END CASE;
18  END;
19  /

> 1! Still > 1! PL/SQL procedure successfully completed. SQL> SQL>

 </source>
   
  


CASE WHEN with constant

   <source lang="sql">
 

SQL> SQL> SQL> DECLARE

 2    v_TestVar NUMBER := 2;
 3  BEGIN
 4    CASE v_TestVar
 5      WHEN 2 THEN DBMS_OUTPUT.PUT_LINE("Two!");
 6      WHEN 3 THEN DBMS_OUTPUT.PUT_LINE("Three!");
 7      WHEN 4 THEN DBMS_OUTPUT.PUT_LINE("Four!");
 8    END CASE;
 9  END;
10  /

Two! PL/SQL procedure successfully completed. SQL> SQL>

 </source>
   
  


Case with else

   <source lang="sql">

SQL> SQL> -- case with else SQL> SQL> declare

 2    l_num number := 8;
 3  begin
 4    case l_num
 5      when 1 then dbms_output.put_line("You selected one");
 6      when 2 then dbms_output.put_line("You selected two");
 7      when 3 then dbms_output.put_line("You selected three");
 8      when 4 then dbms_output.put_line("You selected four");
 9      when 5 then dbms_output.put_line("You selected five");
10      when 6 then dbms_output.put_line("You selected six");
11      when 7 then dbms_output.put_line("You selected seven");
12      when 8 then dbms_output.put_line("You selected eight");
13      when 9 then dbms_output.put_line("You selected nine");
14      when 0 then dbms_output.put_line("You selected zero");
15      else dbms_output.put_line("You selected more than one digit...");
16    end case;
17  end;
18  /

You selected eight PL/SQL procedure successfully completed. SQL>


 </source>
   
  


Output discount rate based on different category

   <source lang="sql">
   

SQL> CREATE TABLE books (

 2    isbn      CHAR(10) PRIMARY KEY,
 3    category  VARCHAR2(20),
 4    title     VARCHAR2(100),
 5    num_pages NUMBER,
 6    price     NUMBER,
 7    copyright NUMBER(4),
 8    emp1   NUMBER,
 9    emp2   NUMBER,
10    emp3   NUMBER
11  );

Table created. SQL> SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2, emp3)

 2             VALUES ("1", "Database", "Oracle", 563, 39.99, 2009, 1, 2, 3);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2)

 2             VALUES ("2", "Database", "MySQL", 765, 44.99, 2009, 4, 5);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2, emp3)

 2             VALUES ("3", "Database", "SQL Server", 404, 39.99, 2001, 6, 7, 8);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2, emp3)

 2             VALUES ("4", "Database", "SQL", 535, 39.99, 2002, 4, 5, 9);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2)

 2             VALUES ("5", "Database", "Java", 487, 39.99, 2002, 10, 11);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2)

 2             VALUES ("6", "Database", "JDBC", 592, 39.99, 2002, 12, 13);

1 row created. SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, emp1, emp2, emp3)

 2             VALUES ("7", "Database", "XML", 500, 39.99, 2002, 1, 2, 3);

1 row created. SQL> SQL> SET SERVEROUTPUT ON ESCAPE OFF SQL> SQL> DECLARE

 2     v_category books.category%TYPE;
 3     v_discount NUMBER(10,2);
 4     v_isbn books.isbn%TYPE := "3";
 5  BEGIN
 6     SELECT category INTO v_category FROM books WHERE isbn = v_isbn;
 7
 8     CASE v_category
 9         WHEN "Database"
10            THEN v_discount := .5;
11         WHEN "Oracle Server"
12            THEN v_discount := .1;
13     END CASE;
14     DBMS_OUTPUT.PUT_LINE("The discount is "||v_discount*100||" percent");
15  EXCEPTION
16     WHEN OTHERS
17     THEN
18        DBMS_OUTPUT.PUT_LINE(SQLERRM);
19  END;
20  /

The discount is 50 percent PL/SQL procedure successfully completed. SQL> SQL> drop table books; Table dropped. SQL>



 </source>
   
  


Simple case demo

   <source lang="sql">

-- read user input set echo off set define "&" set verify off set serveroutput on size 10000 prompt accept NUM prompt "Enter a single digit number : " prompt declare

 l_num number := &NUM;

begin

 case l_num
   when 1 then dbms_output.put_line("You selected one");
   when 2 then dbms_output.put_line("You selected two");
   when 3 then dbms_output.put_line("You selected three");
   when 4 then dbms_output.put_line("You selected four");
   when 5 then dbms_output.put_line("You selected five");
   when 6 then dbms_output.put_line("You selected six");
   when 7 then dbms_output.put_line("You selected seven");
   when 8 then dbms_output.put_line("You selected eight");
   when 9 then dbms_output.put_line("You selected nine");
   when 0 then dbms_output.put_line("You selected zero");
 end case;

end; /



 </source>
   
  


This CASE statement is labeled

   <source lang="sql">
 

SQL> SQL> DECLARE

 2    v_TestVar NUMBER := 1;
 3  BEGIN
 4    <<MyCase>>
 5    CASE v_TestVar
 6      WHEN 1 THEN DBMS_OUTPUT.PUT_LINE("One!");
 7      WHEN 2 THEN DBMS_OUTPUT.PUT_LINE("Two!");
 8      WHEN 3 THEN DBMS_OUTPUT.PUT_LINE("Three!");
 9      WHEN 4 THEN DBMS_OUTPUT.PUT_LINE("Four!");
10    END CASE MyCase;
11  END;
12  /

One! PL/SQL procedure successfully completed. SQL>

 </source>
   
  


Uses a NUMBER datatype as the selector

   <source lang="sql">
   

SQL> SQL> DECLARE

 2    selector NUMBER := 0;
 3  BEGIN
 4    CASE selector
 5      WHEN 0 THEN
 6        dbms_output.put_line("Case 0!");
 7      WHEN 1 THEN
 8        dbms_output.put_line("Case 1!");
 9      ELSE
10        dbms_output.put_line("No match!");
11    END CASE;
12  END;
13  /

Case 0! PL/SQL procedure successfully completed. SQL> SQL>



 </source>