zoukankan      html  css  js  c++  java
  • [bbk4979]第06集 Chapter 04 Interacting with Oracle Database Server:SQL Statements in PL/SQL Programs(01)

    Objectives

    After completing this lesson,you should be table to do the following:

    • Determine the SQL statements that can be directly included in a PL/SQL executeable block.
    • Manipulate data with DML statements in PL/SQL
    • Use transaction control statements in PL/SQL
    • Make use of the INTO clause to hold the values returned by a SQL statement
    • Differentiate between implicit cursors and explicit cursors
    • Use SQL cursor attributes

    Agenda

    • Retrieving data with PL/SQL
    • Manipulating data with PL/SQL
    • Introducing SQL cursors

    SQL Statements in PL/SQL

    • Retrieve a row from the database by using the SELECT command.
    • Make chanages to rows in the database by using DML commands.
    • Control a transaction with COMMIT,ROLLBACK,or SAVEPOINT command;

    一个PL/SQL的blokc中,如果执行完毕了,里面的事务不会自动处理(COMMIT,ROLLBACK),必须显示处理.

    SELECT Statements in PL/SQL

    Retrieve data from the database with a SELECT statement.

    Syntax:(带有明显PL/SQL烙印的SELECT)

    SELECT select_list
    INTO  { variable_name[,variable_name]... | record_name }
    FROM table
    [WHERE condition]
    • The INTO clause is required.
    • Queries must return only one row.
    Demo 01
    DECLARE
            v_fname employees.first_name%TYPE;
            --v_fname VARCHAR2(25);
    BEGIN
            SELECT first_name INTO v_fname
            FROM employees WHERE employee_id = 200;
    
            DBMS_OUTPUT.PUT_LINE('First Name is ' || v_fname);
    END;
    /

    Retrieving Data in PL/SQL:Example

    Retrieving hire_date and salary for the specified employee.

    Demo 02
    DECLARE
            v_emp_hire_date employees.hire_date%TYPE;
            v_emp_salary    employees.salary%TYPE;
    BEGIN
            SELECT hire_date,salary INTO v_emp_hire_date,v_emp_salary
            FROM employees
            WHERE employee_id = 100;
    
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp_hire_date,'YYYY-MM-DD HH24:MI:SS') || '->' || TO_CHAR(v_emp_salary,'$999,999.00'));
    END;
    /

    Return the sum of salaries for all the employees in the specified department.

    Example:

    Demo 03
    DECLARE
            v_sum_sal       employees.salary%TYPE;
            v_dept_no       employees.department_id%TYPE := 60;
    BEGIN
            SELECT SUM(salary)      --group function
            INTO v_sum_sal
            FROM employees
            WHERE department_id = v_dept_no;
    
            DBMS_OUTPUT.PUT_LINE('The sum of salary is ' || TO_CHAR(v_sum_sal,'$999,999.00'));
    END;
    /

    Naming Ambiguities(含糊不清)

    Demo 01
    DECLARE
            hire_date       employees.hire_date%TYPE;
            sysdate         hire_date%TYPE;
            employee_id     employees.employee_id%TYPE := 176;
    BEGIN
            SELECT hire_date,sysdate
            INTO hire_date,sysdate
            FROM employees
            WHERE employee_id = employee_id;
    END;
    
    /
    SQL> @s3_2
    DECLARE
    *
    ERROR at line 1:
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at line 6

    问题出在:WHERE employee_id = employee_id;PL/SQL优先会将employee_id当做列名来处理.employee = employee_id;就相当于1 = 1;所以会查询出很多列来.就出现了上述的错误.

    Naming Conventions

    • Use a naming convention to avoid ambiguity in the WHERE clause.
    • Avoid using database column names as identifiers.
    • Syntax can arise because PL/SQL checks the database first for a column in the table.
    • The names of local variables and formal parameters take precedences over the names of database tables.
    • The names of database table columns take precedence over the names of local variables.(可以联想Naming Ambiguities中的Demo)

    Using PL/SQL to Manipulate Data

    Make change to database tables by using DML commands:

    • INSERT
    • UPDATE
    • DELETE
    • MERGE

    Demo 01
    BEGIN
            INSERT INTO emp(employee_id,first_name,last_name,email,hire_date,job_id,salary)
            VALUES(employees_seq.NEXTVAL,'Ruth','Cores','ROCRES',CURRENT_DATE,'AD_ASST',4000);
            COMMIT;
    END;
    
    /
    
    SELECT * FROM emp ORDER BY employee_id;

    Updating Data:Example

    Increase the salary of all employees who are stock clerks.

    Demo 02
    SELECT employee_id,last_name,salary,job_id FROM emp WHERE job_id = 'ST_CLERK';
    
    DECLARE
            sal_increase    employees.salary%TYPE := 800;
    BEGIN
            UPDATE emp
            SET     salary = salary + sal_increase
            WHERE job_id = 'ST_CLERK';
    
            COMMIT;
    END;
    
    /
    
    SELECT employee_id,last_name,salary,job_id FROM emp WHERE job_id = 'ST_CLERK';
  • 相关阅读:
    fail-fast以及Iterator对象
    LeetCode~1351.统计有序矩阵中的负数
    LeetCode~75.颜色分类
    LeetCode~5364. 按既定顺序创建目标数组
    LeetCode~945.使数组唯一的最小增量
    LeetCode~409. 最长回文串
    笔记: SpringBoot + VUE实现数据字典展示功能
    JSON parse error: Cannot deserialize value of type `java.util.Date` from String
    为什么要用location的hash来传递参数?
    初识Git
  • 原文地址:https://www.cnblogs.com/arcer/p/3029927.html
Copyright © 2011-2022 走看看