您的位置:首页 > 数据库 > Oracle

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操作,如INSERTUPDATE
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

当你同时需要NativedynamicSQLDBMS_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;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: