/* 1.动态SQL的概念 动态SQL是指在运行PL/SQL块时动态输入SQL语句。在PL/SQL块中只能执行DDL(create、alter、drop)、DCL (grant、revoke)或比较灵活的SQL语句(如select子句不带where条件); 动态SQL的性能不如静态SQL,但是比较灵活; 在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始); 2.动态SQL的语法 2.1 使用execute immediate语句 可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke) 以及单行的select子句;但是不能处理多行查询语句。 2.2 使用open...for,fetch和close语句 在游标中使用。 2.3 使用批量动态SQL语句 */
1、DDL
1-1、DDL的概述
DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括
数据库本身,以及数据库对象,像:表、视图等等,DDL对这些对象和属性的管理和定义具体表现在Create、Drop和Alter上。特别注意:DDL操作的“对象”的概念,”对象“包括对象及对象的属性,而且对象最小也比记录大个层次。以表举例:Create创建数据表,Alter可以更改该表的字段,Drop可以删除这个表,从这里我们可以看到,DDL所站的高度,他不会对具体的数据进行操作。
1-2、DDL的主要语句(操作)
Create语句:可以创建数据库和数据库的一些对象。
Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。
Alter语句:修改数据表定义及属性。
1-3、DDL的操作对象(表)
1-3-1、表的概念
表的创建就是用来存放数据用的,由于我们存放的数据的不通,所以我们需要定义些数据类型,以方便管理。
1-3-2、表的属性 www.2cto.com
主键属性:主键就是主键约束,只不过起的名字不同了,主键的起名偏向于虚的(就是描述描述这件事),主键约束起名偏向于实得(就是描述操作的实施),描述的都是同一件事,主键约束就是表中的一个属性;在一个表中最多可以有一个主键;一个主键可以定义在一个或多个字段;主键使一个或多个字段的值必须唯一且不为空,这样做可以通过该字段或该组字段中的值唯一的代表一条记录。
唯一属性:一个表中只能有一个主键属性,为了方表用户,提出唯一约束;唯一约束可以定义在一个或多个字段上;唯一约束使该字段或该组字段中的值唯一,可以为空,但是,不能重复。
外键属性:又叫外键,又叫外键约束,跟主键和主键约束的关系是一样的;外键约束针对的两个表,如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表,但要注意,必须要计算机要知道你是这种关系。
核查、Null和缺省属性:核查属性又叫核查约束,Null属性又叫Null约束,缺省属性又叫缺省约束;这些名称是描述一件事,描述一种情况,这件事或这张情况我们当然可以人为的那样特意做(输入数据是注意就行),但是,他们的本意是实现自动化,也就是让计算机做这件事。
(你知道为什么建立主键和唯一约束的时候,会自动的创建索引吗?而且是唯一索引,想一想索引大多在那些字段上用,以及索引的作用就会知道了。像主键约束、唯一约束、非空约束、外键约束、核查约束和缺省约束这些操作都是使表具有某些特性,所以在这里我认为他们都是表的属性。)
01:使用execute immediate处理DDL语句--create declare create_table varchar2(200); begin create_table:='create table ' ||'&table_name' ||'(sid int, sno int)'; execute immediate create_table ; end;
02:使用execute immediate处理DDL语句---alter declare alter_table varchar2(200); begin alter_table:='alter table &target_table_name modify &column_name varchar2(10)'; execute immediate alter_table ; end;03:使用execute immediate处理DDL语句---drop declare drop_table varchar2(200); begin drop_table:='drop table ' ||'&target_table_name'; execute immediate drop_table ; end;04:使用execute immediate处理DDL语句--drop table create or replace procedure drop_table (table_name varchar2) is sql_sta varchar2(200); begin sql_sta:='drop table ' ||table_name; execute immediate sql_sta; end; --调用方法: exec drop_table('accp');05:使用execute immediate处理DDL语句--create+select declare select_sta varchar2(200); emp_rec emp%rowtype; begin execute immediate 'create table sodi(sid int, sno int)'; select_sta:='select * from emp where empno=:id'; execute immediate select_sta into emp_rec using &1; /*使用占位符时,这个占位符是在引号内使用的*/ end;
2、DML
2-1、DML的概述
DML(Data Manipulation Language 数据操控语言)用于操作数据库对象中包含的数据,也就是说操作的单位是记录。
2-2、DML的主要语句(操作)
Insert语句:向数据表张插入一条记录。
Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是,它的操作对象仍是记录。
Update语句:用于修改已存在表中的记录的内容。
2-3、DML的操作对象——记录
2-3-1、注意
当我们对记录进行Insert、Delete和Update操作的时候,一定要注意,一定要清楚DDL对其的一些操作。
1.处理无占位符和return子句的DML语句
01:查询子句:select declare sql_stat varchar2(100); begin sql_stat:='select * from emp'; execute immediate sql_stat; end; 02:同时实现新建一个表并插入数据--create+insert+update+delete declare create_table varchar2(200); insert_table varchar2(200); update_table varchar2(200); delete_table varchar2(200); begin create_table:='create table &table_name (sid int, sno int)'; execute immediate create_table ; insert_table:='insert into &table_name values (&sid, &sno)'; execute immediate insert_table; update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table; delete_table:='delete from &delete_tablename'; execute immediate delete_table; end;2.处理占位符的DML语句01:处理占位符的DML语句:create+update+insert+delete declare create_table varchar2(200); insert_table varchar2(200); update_table varchar2(200); delete_table varchar2(200); begin create_table:='create table &table_name (sid int, sno int)'; execute immediate create_table ; insert_table:='insert into &target_table_name values (:sid, :sno)'; execute immediate insert_table using &1,&2; update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value '; execute immediate update_table using &3 ,&4; delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value'; execute immediate delete_table using &5; end;3.处理包含returning子句的DML语句 01:处理包含returning子句的DML语句--create+insert+update declare create_table varchar2(200); insert_table varchar2(200); update_table varchar2(200); res varchar2(100); begin create_table:='create table &new_table_name (sid int, sno int)'; execute immediate create_table; insert_table:='insert into &insert_target_table_name values (:sid, :sno)'; execute immediate insert_table using &1,&2 ; update_table:='update &update_target_table_name set &udpate_column_name=:new_value where &condition_column_name=:old_value returning &returning_name into :res'; execute immediate update_table using &3,&4 returning into res; dbms_output.put_line('the result is : ' ||res); end;
3、DCL
3-1、DCL的概述
DCL(Data Control Language 数据控制语句)的操作是数据库对象的权限,这些操作的确定使数据更加的安全。
3-2、DCL的主要语句(操作)
Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。
Revoke语句:可以废除某用户或某组或所有用户访问权限
3-3、DCL的操作对象(用户)
此时的用户指的是数据库用户。