开发者社区> 科技小先锋> 正文

在PL/SQL中使用SQL,动态SQL语句

简介:
+关注继续查看
在PL/SQL中使用 SQL 
  1. SQL语句的分类 
  SQL语句可以五类: 
  数据操纵语言(DML):用来改变表中已有的数据或者查询数据库表中的数据,但是不会改变表,或者其他对象的结构。 
  数据定义语言(DDL):用来创建、删除或者改变某数据模式对象的结构。更改数据模式对象的权限命令也是DDL。 
  事务控制语句:将SQL语句组织成逻辑事务,事务中的语句作为一个整体执行,或者全部成功或者全部失败。这保证了数据的一致性。 
  会话控制语句:会改变单个数据库会话的设置——例如,启用SQL跟踪或启动一个事件。 
  系统控制语句:会改变整个数据库的设置——例如,启用或禁用存档。 
  类别 
  SQL语句范例 
   
  数据操纵语言(DML) 
  SELECT、INSERT、UPDATE、DELETE、EXPLAIN PLAN 
   
  数据定义语言(DDL) 
  DROP、CREATE、ALTER、GRANT、REVOKE 
   
  事务控制 
  COMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTION 
   
  会话控制 
  ALTER SESSION、SET ROLE 
   
  系统控制 
  ALTER SYSTEM 
   
  2. 在PL/SQL中使用 SQL 
   在PL/SQL中可以直接使用的SQL语句只有DML和事务控制语句,(EXPLAIN PLAIN 尽管属于DML,但使用他也是非法的)要使用DDL语句的话,必须使用动态SQL。 
  为什么会这样?我们先看一下PL/SQL的设计方法。 
  2.1 PL/SQL的设计方法——早邦定 
   大家知道,程序设计语言按照两种方式邦定变量——早期邦定和后期邦定。邦定变量是识别程序中标示符存储位置的过程。在PL/SQL中还包括检查数据库得到访问引用对象的权限。(即在编译期间确定对象的权限,并与其标示符相邦定) 
   PL/SQL在设计时特别采用了早期邦定。这样,一个语句块的执行将尽变快,因为所有的数据库对象在运行前都已经被编译器所确定。这样设计的结果是,DDL语句被禁止使用了。因为DDL语句会修改数据库对象,而数据库对象的权限是在编译期间决定的。 
   下面举例子说明: 
   BEGIN 
   CREATE TABLE temp_table( 
   num_value NUMBER, 
   char_value CHAR(10); 
   INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’); 
   END; 
   在编译这个语句块时,temp_table标示符必须是邦定过的。于是这个过程将检查该表是否存在,但是该表在被运行之前是不会存在的。所以编译通不过,因为该语句块不能被编译,所以他也不可能运行。 
  2.2 使用动态SQL语句 
   这样,要在PL/SQL中使用DDL语句,就必须使用动态SQL语句。什么是动态SQL语句? 
   动态SQL语句允许你在运行时动态生成SQL语句,然后对其进行分析并执行。因为语句在运行之前并位创建出来,所以PL/SQL编译器不必邦定语句中的标示符,这样整个语句就可以通过编译。 
   例如上面的例子: 
   BEGIN 
   EXECUTE IMMEDIATE ‘CREATE TABLE temp_table( 
   num_value NUMBER, 
   char_value CHAR(10)’; 
   EXECUTE IMMEDIATE ‘INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’)’; 

   END;



本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/354934,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云城市服务商分享怎么使用DTS迁移PPAS数据
使用数据传输服务(DTS)将本地数据库迁移到 RDS for PPAS,可以实现应用不停服务的情况下,平滑完成数据库的迁移工作。迁移过程中,对本地的 Oracle 数据库没有影响。那么如何操作呢,湖北区域阿里云城市服务商捷讯技术告诉您怎么使用怎么使用DTS迁移PPAS数据
1504 0
使用DTS从RDS PG实时同步数据到AnalyticDB for PostgreSQL
DTS支持从RDS PG将数据实时同步到AnalyticDB for PG,用户可以很方便的搭建起RDS PG到AnalyticDB for PG的数据同步,轻松实现数据的流转和复杂查询的优化。 使用DTS的前提条件 要求同步的数据表,必须建有主键(通过主键来保证源端和目标端表记录一致性)。
2464 0
XamlReader动态使用xaml
原文:XamlReader动态使用xaml xamlload先在xaml做出一个grid,命名xgrid 用和前面写 但是位置不一样的按钮 private void button_Click(obje...
712 0
Access中使用sql查询
在ACCESS中使用SQL查询语句检查SQL语法时非常有用。 操作步骤如下: 【创建】->【查询设计】 直接关闭弹出的【显示表】 找到【SQL视图】: 在查询命令窗口输入命令,然后执行运行命令。
763 0
寻找没有使用绑定变量的sql语句
SELECT plan_hash_value, COUNT (*) FROM v$sql WHERE plan_hash_value 0GROUP BY plan_hash_valueORDER BY 2 DESC;SELECT * FR...
555 0
使用SQL Server 2005作业设置定时任务
原文:使用SQL Server 2005作业设置定时任务 公司有一个老项目由于直接把终端拍摄的图片以二进制的形式保存到数据库中,数据库比较大所以需要经常删除这些冗余数据,手动删除费时费力,项目组长让我把这些操作变成自动的,每天执行一次,只保留最近两个月的图片数据。
696 0
在64位机器上使用plSQL连接Oracle的问题(SQL*Net not properly installed)
问题背景:         我在64位机器上了64位的oracle客户端。         然后装上PL/SQL Developer,但是连接oracle老报这个错:         Initialization error              SQL*Net not properly installed         OracleHomeKey:           
1396 0
SQL使用链接服务器执行远程数据库上的存储过程
原文:SQL使用链接服务器执行远程数据库上的存储过程   --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin'server_tmp','fa...
1258 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载