一、PL / SQL中检索数据
(1)PL / SQL中的SQL语句
可以在PL / SQL中使用以下几种SQL语句:
•SELECT从数据库检索数据。
•DML语句,例如INSERT,UPDATE和DELETE,以更改数据库中的行。
•事务控制语句,例如COMMIT,ROLLBACK或SAVEPOINT。 您使用事务控制语句对数据库进行更改/永久或丢弃它们。 事务控制语句将在本课程后面介绍。
本文包含SELECT语句。
(2)不能直接在PL / SQL中使用DDL和DCL。
PL / SQL不直接支持数据定义语言(DDL)语句,例如CREATE TABLE,ALTER TABLE或DROP TABLE以及DCL语句(如GRANT和REVOKE)。
您不能直接执行DDL和DCL语句,因为它们是在运行时构建和执行的。 也就是说,它们是动态的。 静态SQL语句是编译程序时修复的语句。
二、PL / SQL中的SELECT语句
(1)用SELECT语句从数据库中检索数据句法:
SELECT select_listINTO {variable_name [, variable_name ]...| record_name}FROM table[WHERE condition];
INTO子句是强制性的,发生在SELECT和FROM子句之间。 它用于指定保存SQL从SELECT子句返回的值的PL / SQL变量的名称。 您必须为每个选定的项目指定一个变量,并且变量的顺序必须与所选项目相对应。
DECLAREv_country_name wf_countries.country_name%TYPE;
BEGINSELECT country_name INTO v_country_nameFROM wf_countries WHERE country_id= 359;DBMS_OUTPUT.PUT_LINE(' The country name is :'||v_country_name);
END;
(2)在PL / SQL中检索数据
检索指定员工的hire_date和薪水。
例:
DECLAREv_emp_hiredate employees.hire_date%TYPE;v_emp_salary employees.salary%TYPE;
BEGINSELECT hire_date, salaryINTO v_emp_hiredate, v_emp_salaryFROM employeesWHERE employee_id = 100;DBMS_OUTPUT.PUT_LINE('Hiredate is: ' || v_emp_hiredate|| ' and Salary is: '|| v_emp_salary);
END;
PL / SQL块中的SELECT语句属于嵌入式SQL的ANSI分类,适用以下规则:
查询必须返回一行。 返回多行或无行的查询会生成错误。 您将在本课程后期学习错误处理。
DECLAREv_salary employees.salary%TYPE;
BEGINSELECT salary INTO v_salaryFROM employees;DBMS_OUTPUT.PUT_LINE(' Salary is : ' || v_salary);
END;
返回指定部门中所有员工的工资总额。
DECLAREv_sum_sal NUMBER(10,2);v_deptno NUMBER NOT NULL := 60;
BEGINSELECT SUM(salary) -- group functionINTO v_sum_sal FROM employeesWHERE department_id = v_deptno;DBMS_OUTPUT.PUT_LINE ('The sum of salary is '|| v_sum_sal);
END;
(3)在PL / SQL中检索数据的准则
•用分号(;)终止每个SQL语句。
•检索的每个值必须使用INTO子句存储在变量中。
•WHERE子句是可选的,可以包含输入变量,常量,文字或PL / SQL表达式。 但是,应该只提取一行,因此几乎在所有情况下都需要使用WHERE子句。
•在INTO子句中指定与SELECT子句中的数据库列相同数量的变量。 确保它们的位置对应,并且它们的数据类型是兼容的。
•使用%TYPE声明接收变量。
三、命名约定准则
(1)在可能不明确的SQL语句中,数据库列的名称优先于局部变量的名称
DECLAREv_hire_date employees.hire_date%TYPE;employee_id employees.employee_id%TYPE := 176;
BEGINSELECT hire_dateINTO v_hire_dateFROM employeesWHERE employee_id = employee_id;
END;
此示例引发未处理的运行时异常,因为在WHERE子句中,PL / SQL变量名称与employees表中的数据库列名称的名称相同。
(2)在以下PL / SQL块中删除了什么?
DECLARElast_name VARCHAR2(25) := 'King';
BEGINDELETE FROM emp_dup WHERE last_name = last_name;
END;
(3)命名约定准则
•使用命名约定来避免WHERE子句中的歧义。
•避免使用数据库列名作为标识符。
•执行期间可能会发生错误,因为PL / SQL会首先检查表中列的数据库。
•局部变量和形式参数的名称优先于数据库表的名称(在PL / SQL语句中)。
•数据库表列的名称优先于局部变量的名称。