Oracle 11g Release 1 (11.1) PL/SQL_了解静态和动态 SQL
2012-07-04 14:59
465 查看
本文内容
静态SQL动态SQL
静态SQL
静态SQL是属于PL/SQL语言的SQL。也就是:除了解释执行计划的,数据操作语句(DataManipulationLanguage,DML)
事务控制(TransactionControlLanguage,TCL)语句
SQL函数
SQL伪列
SQL运算符
静态SQL符合目前ANSI/ISOSQL标准。
示例1:演示用PL/SQL操作数据
若操作数据库的数据,则无需任何特别的符号,你可以直接在PL/SQL程序里包含DML操作,如INSERT、UPDATE和
DELETE语句。你也可以直接在PL/SQL程序里包含COMMIT语句。
CREATETABLEemployees_temp
ASSELECTemployee_id,first_name,last_name
FROMemployees;
DECLARE
emp_idemployees_temp.employee_id%TYPE;
emp_first_nameemployees_temp.first_name%TYPE;
emp_last_nameemployees_temp.last_name%TYPE;
BEGIN
INSERTINTOemployees_tempVALUES(299,'Bob','Henry');
UPDATEemployees_temp
SETfirst_name='Robert'WHEREemployee_id=299;
DELETEFROMemployees_tempWHEREemployee_id=299
RETURNINGfirst_name,last_name
INTOemp_first_name,emp_last_name;
COMMIT;
DBMS_OUTPUT.PUT_LINE(emp_first_name||''||emp_last_name);
END;
/
示例2:演示在PL/SQL调用SQL函数——COUNT函数
DECLARE
job_countNUMBER;
emp_countNUMBER;
BEGIN
SELECTCOUNT(DISTINCTjob_id)
INTOjob_count
FROMemployees;
SELECTCOUNT(*)
INTOemp_count
FROMemployees;
END;
/
示例3:演示使用伪列——ROWNUM
CREATETABLEemployees_tempASSELECT*FROMemployees;
DECLARE
CURSORc1ISSELECTemployee_id,salaryFROMemployees_temp
WHEREsalary>2000ANDROWNUM<=10;--10arbitraryrows
CURSORc2ISSELECT*FROM
(SELECTemployee_id,salaryFROMemployees_temp
WHEREsalary>2000ORDERBYsalaryDESC)
WHEREROWNUM<5;--first5rows,insortedorder
BEGIN
--Eachrowgetsassignedadifferentnumber
UPDATEemployees_tempSETemployee_id=ROWNUM;
END;
/
动态SQL
动态SQL是用编程的方式在运行时创建并执行SQL语句。这在编写通用或灵活的程序,像adhoc查询系统,或在编写必须执行DLL语句的程序,或是在编译期间不确定整个SQL文本、数量,以及输入输出变量的数据类型时,很有用。PL/SQL提供两种方式编写动态SQL:
本地动态SQL(NativedynamicSQL),创建并执行动态SQL语句是PL/SQL语言的特点
DBMS_SQL包是创建、执行和描述动态SQL语言的API
NativedynamicSQL代码比其等价的使用DBMS_SQLpackage代码更容易读写,执行也快。特别是,当它通过编译器优化后。然而,若编写
NativedynamicSQL代码,你必须在编译期间知道输入和输出变量的数据类型和数量。否则,只能使用
DBMS_SQLpackage。
当你同时需要NativedynamicSQL和DBMS_SQLpackage
时,你可以通过DBMS_SQL.TO_REFCURSOR函数和
DBMS_SQL.TO_CURSOR_NUMBER函数在它们之间进行切换。
何时使用静态SQL或动态SQL
在PL/SQL,下面情况需要动态SQL:
编译期间无法确定SQL文本。例如,SELECT语句包含一个事先不确定的标识符,如表名,或是
WHERE子句中的一部分在编译期间不确定。
静态SQL不支持的。也就是不能用静态SQL创建的任何SQL。
若不需要动态SQL,则使用静态SQL的好处如下:
成功的编译会验证静态SQL引用可靠的数据库对象,以及访问这些对象的必需权限。
成功的编译会创建模式对象依赖。
示例4:演示从动态PL/SQL块调用一个子程序
--SubprogramthatdynamicPL/SQLblockinvokes:
CREATEPROCEDUREcreate_dept(deptidINOUTNUMBER,
dnameINVARCHAR2,
mgridINNUMBER,
locidINNUMBER
)AS
BEGIN
deptid:=departments_seq.NEXTVAL;
INSERTINTOdepartmentsVALUES(deptid,dname,mgrid,locid);
END;
/
DECLARE
plsql_blockVARCHAR2(500);
new_deptidNUMBER(4);
new_dnameVARCHAR2(30):='Advertising';
new_mgridNUMBER(6):=200;
new_locidNUMBER(4):=1700;
BEGIN
--DynamicPL/SQLblockinvokessubprogram:
plsql_block:='BEGINcreate_dept(:a,:b,:c,:d);END;';
/*SpecifybindargumentsinUSINGclause.
Specifymodeforfirstparameter.
Modesofotherparametersarecorrectbydefault.*/
EXECUTEIMMEDIATEplsql_block
USINGINOUTnew_deptid,new_dname,new_mgrid,new_locid;
END;
/
相关文章推荐
- Oracle 11g Release 1 (11.1) PL/SQL_了解静态和动态 SQL
- Oracle 11g Release 1 (11.1) PL/SQL_了解 Collections 和 Records 类型
- Oracle 11g Release 1 (11.1) PL/SQL Collection 方法
- Oracle 11g Release 1 (11.1) 游标——在 PL/SQL 管理游标
- Oracle 11g Release 1 (11.1) PL/SQL_多维 Collection 类型和其异常
- Oracle 11g Release 1 (11.1) PL/SQL_理解 Collection 类型
- Oracle 11g Release 1 (11.1) PL/SQL_理解 Record 类型
- Oracle 11g Release 1 (11.1) SQL_层级查询(详)
- Oracle 11g Release 1 (11.1) SQL_层级查询(概)
- Oracle 11g Release 1 (11.1) 游标——SQL 游标(隐式)
- Oracle 11g Release 1 (11.1) 表空间——简单管理永久表空间
- 【转】Win7 64bit Oracle 11g 使用PL/SQL Developer 连接时提示“SQL*Net not properly installed”
- win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
- Oracle 11g R2 for Win7旗舰版(64位)的安装步骤注意事项+PL/SQL Development
- PL/SQL Developer连接本地Oracle 11g 数据库
- Oracle 11g Release 1 (11.1) 单行函数——比较函数
- PL/SQL 连接Oracle 11g
- Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置
- Oracle 11g Release 1 (11.1) 表空间——创建和扩展永久表空间
- PL/SQL连接Oracle 11g配置使用成功!(64位Oracle使用PL/SQL)