搜档网
当前位置:搜档网 › RHEL上oracle启动后 客户端PLSQL登录时报 12541 TNS 无监听程序

RHEL上oracle启动后 客户端PLSQL登录时报 12541 TNS 无监听程序

RHEL上oracle启动后 客户端PLSQL登录时报 12541 TNS 无监听程序
RHEL上oracle启动后 客户端PLSQL登录时报 12541 TNS 无监听程序

RHEL上oracle启动后,客户端PL/SQL登录时报“12541: TNS: 无监听程序”

【问题】

虚拟机上的RHEL安装oracle,在系统启动后,用客户端PL/SQL登录oracle时,报以下错误:

但是,如果我们在主机终端上,使用sqlplus命令,又是可以连接到数据库的。

我先给出这个问题的原因:虚拟机连接到了internet上,并且其中某个网卡使用了DHCP,使得oracle在启动侦听程序时,主机名不匹配。

【虚拟机的网卡配置】

先来看看问题的场景:

本例中,虚拟机设置了三个网卡,分别是:

其中,eth0、eth1使用的是静态地址,eth2是使用DHCP。

特别要注意到,eth2使用的DHCP,并且使用了NA T网段(实际上,如果将eth2设置为bridged 模式,也会出现本文开头处的错误,两者的原理是一样的)。

【ORACLE配置文件】

我们先看一看oracle的配置文件:

$ORACLE_HOME/network/admin/listener.ora文件:

$ORACLE_HOME/network/admin/sqlnet.ora文件:

$ORACLE_HOME/network/admin/tnsnames.ora文件:

看起来ORACLE的配置文件完全正确的。

【侦听端口1521】

我们看看1521端口是不是已经在侦听了:

注意到这里在侦听时,出现了“localhost.localdomain”。实际上,如果要允许其他主机的客户端能够访问这个端口,这里应该是“*”而不是主机名。问题找到了。

【重启lsnrctl】

执行以下命令重启一下侦听:

lsnrctl stop

lsnrctl start

看看日志$ORACLE_HOME/network/log/listener.log:

这里的HOST,怎么是bogon,而不是localhost.localdomain(在listener.ora中配置的)呢?

【奇怪的RHEL登录欢迎页面】

再回过头来看一看系统的控制台登录页面(实际上,用uname也可以看到这个奇怪的bogon):

从虚拟机控制台,可以看到非常奇怪的欢迎词“bogon”。这个应该是本机的主机名,但我们看一下/etc/hosts:

本机的主机名应该是localhost或者localhost.localdomain,怎么会是bogon呢?这个bogon 是从哪里来的呢?

【DHCP】

我们到/etc下搜索所有文件,看看是哪个文件中包含了bogon这个东西:

看看/etc/resolv.conf.predhclient文件中的内容:

哦,找到问题的原因了,这个bogon是dhclient自动生成的。即是说,由于将网卡设置成了DHCP,因此系统调用dhclient获取DHCP动态地址时,从网络上取得了bogon这个主机名。可是,为什么系统启动后,dhclient要去搜索这个bogon呢?这个不是本文要关心的问题了(请参见https://www.sodocs.net/doc/0a4714008.html,/uid-24501667-id-3134989.html,实际上,因为我的电脑连接到internet时,使用了路由器的NAT)。我们现在只需要确保系统的主机名保持为localhost.localdomain就可以了。

【解决问题】

解决问题的方式有几个:

1. 将DHCP的网卡不要设置为NAT或者bridge。

2. 将DHCP的网卡设置为静态地址。

3. 修改/etc/hosts,使得DHCP时主机名字不会被改成bogon(见上文引文)。

本例中,由于我其实并不需要连接到internet,因此,我只是使用了第1种解决方法,即将DHCP所在的网卡(eth2)设置为Host only。

【验证】

系统终端登录欢迎页面:

检查侦听端口:

最关键的是,看一下客户端是否能够登录:

确实成功了!

2013/5/29

SQL中的case-when,if-else实例

create database EXAM go create table student (stuName varchar(10)not null, stuNO int primary key not null, stuSex char(2)check(stuSex='男'or stuSex='女'), stuAge int, stuSeat int, stuAddress varchar(40) ) GO insert into student values('张秋丽','25301','女','21','1','北京海淀'), ('李文才','25302','男','25','2','天津'), ('张三','25303','男','22','3','北京海淀'), ('红尘','25304','女','21','4','湖南长沙'), ('段林希','25305','女','20','5','江西赣州'), ('魏晨','25306','男','23','6','河北石家庄'), ('郑爽','25307','女','20','7',''), ('张杰','25308','男','21','8',''), ('王洁','25309','女','23','9','湖南怀化'), ('刘欣','253010','女','21','10','北京') create table exam (ExamNO int primary key, stuNO int not null, WrittenExam int, LabExam int ) GO insert into exam values(01,250301,86,89), (02,250302,67,78), (03,250303,76,80), (04,250304,79,56), (05,250305,56,63), (06,250306,67,60), (07,250307,90,83), (08,250308,80,79), (09,250309,92,90), (10,250310,55,58)

ORACLE SQLPLUS 常用命令及解释

Oracle SQLPlus常用命令及解释 1.@ 执行位于指定脚本中的SQLPlus语句。可以从本地文件系统或Web服务器中调用脚本。可以为脚本中的变量传递值。在iSQL*Plus中只能从Web服务器中调用脚本。 2.@@ 执行位于指定脚本中的SQL*Plus语句。这个命令和@(“at”符号)命令功能差不多。在执行嵌套的命令文件时它很有用,因为它会在与调用它的命令文件相同的路径或url中查找指定的命令文件。在iSQL*Plus中只支持url形式。 3./ 执行保存在SQL缓冲区中的最近执行的SQL命令或PL/SQL块。在SQL*Plus命令行中,可在命令提示符或行号提示符使用斜线(/)。也可在iSQL*Plus的输入区中使用斜线(/)。斜线不会列出要执行的命令。 4.ACCEPT 可以修改既有变量,也可定义一个新变量并等待用户输入初始值,读取一行输入并保存到给出的用户变量中。ACCEPT在iSQL*Plus中不可用。 5.APPEND 把指定文本添加到SQL缓冲区中当前行的后面。如果text的最前面包含一个空格可在APPEND和text间输入两个空格。如果text的最后是一个分号,可在命令结尾输入两个分号(SQL*Plus会把单个的分号解释为一个命令结束符)。APPEND 在iSQL*Plus中不可用。 6.ARCHIVE LOG 查看和管理归档信息。启动或停止自动归档联机重做日志,手工(显示地)归档指定的重做日志,或者显示重做日志文件的信息。 7.ATTRIBUTE 为对象类型列的给定属性指定其显示特性,或者列出单个属性或所有属性的当前显示特性。 8.BREAK 分开重复列。指定报表中格式发生更改的位置和要执行的格式化动作(例如,在列值每次发生变化时跳过一行)。只输入BREAK而不包含任何子句可列出当前的BREAK定义。 9.BTITLE 在每个报表页的底部放置一个标题并对其格式化,或者列出当前BTITLE定义。

oracle绑定变量及举例

1.什么是绑定变量,及举例 什么是绑定变量,问什么要进行绑定变量? Sql语句的执行要经过解析、执行、提取等几个阶段,其中解析最消耗资源,解析的过程中要进行语法、语义和权限的检查,如果这些检查都通过了,则进行执行,执行完成之后将sql语句的执行计划存储在共享池中,如果下一次有相同的sql语句要执行,则不需要解析,直接按照已经存在的执行计划进行执行,就可以节省资源 当多个sql语句执行的时候大多数情况下是条件相同,只是条件里面的值不同。 例如:A 用户:select * from t where ID=1 B 用户:select * from t where ID=2 绑定变量就是将条件谓词中不同的值保存在一个中间变量中,Oracle对用户每次发起的sql语句做hash运算时,都产生相同的hash 值, 使用相同的执行计划,作为一个sql语句来执行。 Select * from t where ID=:X 下面是绑定变量和非绑定变量的性能比较 1)绑定变量执行 alter session set sql_trace=true; begin for x in 1..10000 loop execute immediate 'select * from t where object_name=:x' using x; end loop; end; alter session set sql_trace=false;

trace文件中的执行计划和统计信息 SQL ID: gdp68zfsdqrbc Plan Hash: 1601196873 select * from t where object_name=:x call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 10000 0.15 0.17 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 10001 0.15 0.17 0 0 0 0 Misses in library cache during parse: 0 Optimizer mode: ALL_ROWS Parsing user id: 5 (SYSTEM) (recursive depth: 1) Rows Row Source Operation ------- --------------------------------------------------- 0 TABLE ACCESS FULL T (cr=0 pr=0 pw=0 time=0 us cost=301 size=196 card=2)

Oracle数据库编程(笔试)

Oracle数据库编程 测试题(笔试)成都朗沃信息技术有限公司

本试题为闭卷笔试考试时间:120分钟答题说明:不定项选择题有一个、两个或两个以上正确选项,漏选、多选、错选均不得分 一、不定项选择题(共40题,每小题2.5分,总分100分) 1.数据库发展方向有:()。 A. SQL开发人员 B.数据库管理员 C. 网络工程师 D. 售前工程师 2.组成PL/SQL程序的最基本的单元是()。 A. 存储过程 B.函数 C. 触发器 D. 匿名块 3.下面哪些是单词是Oracle的关键字()。 A. V ar B. Declare C. End D. User 4.下面关于PL/SQL说法正确的是()。 A. PL/SQL必须编译才能执行 B. SQL不需要编译就能执行 C. 相同的SQL语句只会编译一次 D. PL/SQL中的SQL部分是交给SQL引擎处理的 5.关于Oracle体系架构说法正确的是()。 A. Oracle分为实例和进程两部分。 B. Oracle分为实例和数据库两部分。 C. SGA大小会直接影响到SQL执行的速度。 D. PGA大小会直接影响到SQL执行的速度。 E.以上答案都不正确。 6.下面哪些缓冲区是与性能直接相关的()。 A. 日志缓冲区 B.程序全局区 C. 数据缓冲区 D. SQL共享池 7.实例与数据库的区别是()。 A. 实例就是管理数据库的各种进程。 B.一个实例只能管理一个数据库。 C. 一个数据库可能由多个实例同时管理。 D. 一个数据库只有一个实例管理,叫单实例数据库。一个数据库同时由多个实例管理,叫 多实例数据库。 8.Oracle没有下面哪种数据库类型()。 A. Date B. Smalldatetime C. Boolean D. V archar 9.关于视图,说法正确的有() A. 视图本质就是查询 B.可以通过视图增删改查数据 2

项目开发中常用到的SQL语句

项目开发中常用到的SQL语句1、循环示例 循环示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 DECLARE @i int DECLARE @name varchar(10) DECLARE @password varchar(10) Set @i = 1000 WHILE @i < 1200 BEGIN Set @i =@i +1 SET @name = RIGHT('0000' + CAST(@i AS varchar(10)),4) set @password = @name select @name insert into dbo.LocomotiveTeminalBase (li_ID,t_ID,lt_IDNumber,lt_MiM,lt_FuWQIP,lt_FuWQDKH,lt_CreatedBy) values('d82575c0-2d21-4c47-a406-7771d7d2c80a','fb5d9a7b-9cd6-4a55-9e90-881706eaf @name,@password,'192.168.1.187','2000','9015c234-e185-4e15-96c6-f53426dd6690') END 2、数据库缓存依赖中用到的SQL语句代码示例: ? 1 2 3 4 5 6 7 8 --查看状态 Select DATABASEpRoPERTYEX('soft_LocomotiveRM_DB','IsBrokerEnabled') --启用broker ALTER DATABASE soft_LocomotiveRM_DB SET NEW_BROKER WITH ROLLBACK IMMEDIATE ALTER DATABASE soft_LocomotiveRM_DB SET ENABLE_BROKER --添加用户

oracleDBA笔试经典试题

普通类 一、选择题(单选题) 1、在下列哪一种情况下用户不能被删除( )。 A. 不拥有任何模式对象的用户 B. 当前正处于连接状态的用户 C. 拥有只读表的用户 D. 所有的用户都可以任何时刻删除 2、分析以下的SQL 命令: SELECT manufacturer_id FROM inventory WHERE manufacturer_id LIKE '%N\%P\%O%' ESCAPE '\'; 命令执行的返回结果是() A、所有包含'NPO'的纪录 B 、所有包含'N\P\O'的纪录 C 、所有包含'N%P%O'的纪录 D 、所有包含'%N\P\O%'的纪录 3、游标的哪一种属性指示fetch语句是否从活动集中返回行,如未能返回行,则此属性的值为true ? A、%FOUND B、%NOTFOUND C、%ROWCOUNT D、%ISOPEN 4、下列哪个集合操作符返回两个查询所选择的所有不同的行。 A、Union B、Union all C、Union only D、Intersect 5、如何删除sales表中产品类型为toys的profits列的列值? A、UPDATE sales SET profits = NULL WHERE product_type = 'TOYS' B、DELETE profits FROM sales WHERE product_type = 'TOYS' C、DELETE FROM sales WHERE product_type = 'TOYS' D、DELETE FROM sales 6、参数maxtrans指定每个( D )上允许的最大并发的事务数。 A、table B、segment C、extent D. block

DB2常用SQL语句集

DB2常用SQL语句集 1、查看表结构: describe table tablename describe select * from tablename 2、列出系统数据库目录的内容: list database directory 3、查看数据库配置文件的内容: get database configuration for DBNAME 4、启动数据库: restart database DBNAME 5、关闭表的日志 alter table TBLNAME active not logged inially 6、重命名表 rename TBLNAME1 to TBLNAME2 7、取当前时间 select current time stamp from sysibm.sysdummy1 8、创建别名 create alias ALIASNAME for PRONAME(table、view、alias、nickname) 9、查询前几条记录 select * from TBLNAME fetch first N rows 10、联接数据库 db2 connect to DB user db2 using PWD 11、绑定存储过程命令 db2 bind BND.bnd 12、整理优化表 db2 reorgchk on table TBLNAME db2 reorg table TBLNAME db2 runstats on table TBNAME with distribution and indexes all 13、导出表 db2 export to TBL.txt of del select * from TBLNAME db2 export to TBL.ixf of ixf select * from TBLNAME 以指定分隔符‘|’下载数据: db2 "export to cmmcode.txt of del modified by coldel| select * from cmmcode”14、导入表 db2 import from TBL.txt of del insert into TBLNAME db2 import from TBL.txt of del commitcount 5000 insert into TBLNAME db2 import from TBL.ixf of ixf commitcount 5000 insert into TBLNAME db2 import from TBL.ixf of ixf commitcount 5000 insert_update into TBLNAME db2 import from TBL.ixf of ixf commitcount 5000 replace into TBLNAME db2 import from TBL.ixf of ixf commitcount 5000 create into TBLNAME (仅IXF) db2 import from TBL.ixf of ixf commitcount 5000 replace_create into TBLNAME (仅 IXF) 以指定分隔符“|”加载:

Oracle数据库的绑定变量特性及应用

Oracle 数据库的绑定变量特性及应用 在开发一个数据库系统前,有谁对Oracle 系统了解很多,尤其是它的 特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展的系统; 因此,我写这个主题也是希望让大家更多地掌握Oracle数据库的特性,从而在架构一个新系统时,能考虑系统的可扩展,可伸缩性,也兼顾系统的效率和稳定; 使用绑定变量是Oracle数据库的特性之一;于是大家要问,为什么使用,怎样使用,它的使用限制条件是什么?我会按照这样的想法去解答大家的疑问,我也会以举例子的方式来回答这些问题; 1.为什么使用绑定变量? 这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量; 这里举例说明上述问题; 为了查询一个员工代号是123,你可以这样查询: select * from emp where empno=’123’; 你也可以这样查询: select * from emp where empno=:empno; 象我们往常一样,你查询员工’123’一次以后,有可能再也不用;接着你有可能查询员工’456’,然后查询’789’等等;如果查询使用象第一个查询语句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等; 第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别; 第一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似的,系统的整体性能降低; 而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源; 下面举例子去详细论证上述的问题,不使用绑定变量为生病状况: 这是一个未使用的绑定变量(吃药前): set echo on;(把执行结果显示出来) alter system flush shared_pool;

sql循环语句的写法

sql循环语句的写法 SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end --------------- while 条件 begin 执行操作 set @i=@i+1 end WHILE 设置重复执行SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用BREAK 和CONTINUE 关键字在循环内部控制WHILE 循环中语句的执行。语法WHILE Boolean_expression { sql_statement | statement_block } [ BREAK ] { sql_statement | statement_block } [ CONTINUE ] 参数

Boolean_expression 返回TRUE 或FALSE 的表达式。如果布尔表达式中含有SELECT 语句,必须用圆括号将SELECT 语句括起来。{sql_statement | statement_block} Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字BEGIN 和END。BREAK 导致从最内层的WHILE 循环中退出。将执行出现在END 关键字后面的任何语句,END 关键字为循环结束标记。CONTINUE 使WHILE 循环重新开始执行,忽略CONTINUE 关键字后的任何语句。注释 如果嵌套了两个或多个WHILE 循环,内层的BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。示例 A. 在嵌套的IF...ELSE 和WHILE 中使用BREAK 和CONTINUE 在下例中,如果平均价格少于$30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于$50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过$50,然后退出WHILE 循环并打印一条消息。USE pubs GO WHILE (SELECT A VG(price) FROM titles) < $30 BEGIN

oracledatabase11g,plsql编程实战笔记

Chap1 DML语句是select 、insert、update、delete和merge DDL语句是create、alter、drop、rename、truncate、comment DCL语句是grant、revoke TCL语句是commit、rollback和savepoint sql16个基本命令——参考书《OCA认证考试指南(IZ0-)》清华大学 《oracle database sql language reference 11g》有非遵循格式字符串依赖于格式掩码 chap2 2.1.3 关于语句中有多个单引号时处理: 1、 select'It''s a bird,no plan can''t be 'as pharse from dual; 此处两个单引号即为一个单引号 2、只能用q 再加’(语句)’ select q'(It's a bird,no plan can't be)'as pharse from dual; 均输出 PHARSE ---------------------------- It's a bird,no plan can't be 2.1.4 定义变量与申明变量的区别: 定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化) 替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’ declare lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/ begin lv_whom := '&a'; end; 或者 declare lv_whom varchar2(20); begin lv_whom := &a; end;但是要在输入框中字符加两个单引号 替代变量用define申明,且定义时不可以指定类型,默认为char型 ①Define x=emp; Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/

实验10 T-SQL语言编程基础

实验十 T-SQL语言编程基础 姓名:学号: 专业:网络工程班级: 同组人:无实验日期:2012-4-19【实验目的与要求】 1.熟练掌握变量的定义和赋值。 2.熟练掌握各种运算符。 3.熟练掌握流程控制语句,尤其是条件语句和循环语句。【实验内容与步骤】 10.1. 变量的定义与输出 1.变量的定义和赋值 1) 局部变量的声明: DECLARE @variable_name DataType 例如: declare @stuname varchar(20)--声明一个存放学员姓名的变量stuname. declare @stuseat int--声明一个存放学员座位号的变量stuseat 2) 局部变量的赋值: 局部变量的赋值有两种方法: a) 使用Set语句 Set @variable_name=value b) 使用Select语句 Select @variable_name=value 实验: 运行以下程序段,理解变量的使用。

--局部变量的赋值与使用 declare @customer_name varchar(20)--声明变量用来存放客户名称 set @ customer_name ='家电市场'--使用SET语句给变量赋值 select* from xss where客户名称=@customer_name --通过局部变理向sql语句传递数据 请给出运行结果: 练习: 创建一名为 Product_name的局部变量,并在SELECT语句中使用该变量查找“冰箱”的”价格”和”库存量”。 给出相应的语句 declare @Product_name varchar(20) set @Product_name ='冰箱' select价格,库存量 from CP where产品名称= @Product_name 请给出运行测试结果:

实验7_T-SQL语言编程基础[1]1

实验七T-SQL语言编程基础 【实验目的与要求】 1.熟练掌握变量的定义和赋值。 2.熟练掌握各种运算符。 3.熟练掌握流程控制语句,尤其是条件语句和循环语句。 【实验内容与步骤】 一、准备实验数据 CPXS数据库包含如下三个表: CP(产品编号,产品名称,价格,库存量); XSS(客户编号,客户名称,地区,负责人,电话); CPXSB(产品编号,客户编号,销售日期,数量,销售额); 三个表结构如图2.1~图2.3所示,请在企业管理器中完成表的创建。 图2.1CP表结构

图2.2XSS表结构 图2.3CPXSB表结构 2.1数据写入操作 在企业管理器中输入如图2.4~图2.6的CP表、XSS表和CPXSB表的样本数据。 图2.4CP表的样本数据

图2.5XSS表的样本数据 图2.6CPXSB表的样本数据 10.1.变量的定义与输出 1.变量的定义和赋值 1)局部变量的声明: DECLARE@variable_name DataType 例如: declare@stuname varchar(20)--声明一个存放学员姓名的变量stuname. declare@stuseat int--声明一个存放学员座位号的变量stuseat 2)局部变量的赋值: 局部变量的赋值有两种方法: a)使用Set语句 Set@variable_name=value b)使用Select语句 Select@variable_name=value 实验: 运行以下程序段,理解变量的使用。 --局部变量的赋值与使用 declare@customer_name varchar(20)--声明变量用来存放客户名称set@customer_name='家电市场'--使用SET语句给变量赋值select* from xss where客户名称=@customer_name--通过局部变理向sql语句传递数据请给出运行结果:

PLSQL在from后面使用变量,以及输入'&字符'的方法

PL/SQL在from后面使用变量,以及输入'&字符'的方法 在from后面使用变量 CREATE OR REPLACE FUNCTION GET_TABLE_COUNT( I_TabNa IN VARCHAR2 , I_Owner IN VARCHAR2 DEFAULT NULL ) RETURN NUMBER IS V_RtnVal NUMBER ; V_CursorId INTEGER ; V_SqlStr VARCHAR2(300) ; BEGIN V_CursorId := DBMS_SQL.OPEN_CURSOR ; IF LENGTHB( RTRIM( LTRIM( NVL( I_Owner , '' ) ) ) ) = 0 THEN V_SqlStr := 'SELECT COUNT(*) FROM ' || I_TabNa ; ELSE V_SqlStr := 'SELECT COUNT(*) FROM ' || I_Owner|| '.' || I_TabNa ; END IF ; DBMS_SQL.PARSE( V_CursorId , V_SqlStr , DBMS_SQL.V7 ) ; DBMS_SQL.DEFINE_COLUMN( V_CursorId , 1 , 0 ) ; IF DBMS_SQL.EXECUTE( V_CursorId ) = 0 THEN NULL ; END IF ; IF DBMS_SQL.FETCH_ROWS( V_CursorId ) = 0 THEN RETURN 0 ; END IF ; DBMS_SQL.COLUMN_VALUE( V_CursorId , 1 , V_RtnVal ) ; DBMS_SQL.CLOSE_CURSOR( V_CursorId ) ; RETURN V_RtnVal ; EXCEPTION WHEN OTHERS THEN DBMS_SQL.CLOSE_CURSOR( V_CursorId ) ; -- DBMS_OUTPUT.PUT_LINE( V_SqlStr || SQLERRM ) ; RETURN 0 ; END GET_TABLE_COUNT; 试验结果: SQL> select GET_TABLE_COUNT( 'tab' ) from dual ;

SQL循环语句的写法

SQL循环语句的写法 SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end --------------- while 条件 begin 执行操作 set @i=@i+1 end WHILE 设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 语法 WHILE Boolean_expression { sql_statement | statement_block } [ BREAK ] { sql_statement | statement_block } [ CONTINUE ] 参数 Boolean_expression 返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。 {sql_statement | statement_block} Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字 BEGIN 和 END。 BREAK

导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。 CONTINUE 使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后的任何语句。 注释 如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。 示例 A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE 在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。 USE pubs GO WHILE (SELECT AVG(price) FROM titles) < $30 BEGIN UPDATE titles SET price = price * 2 SELECT MAX(price) FROM titles IF (SELECT MAX(price) FROM titles) > $50 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear' B. 在带有游标的过程中使用 WHILE 以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回–2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取(0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。 USE pubs DECLARE tnames_cursor CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Oracle中SQL语句的几种用法

在诊断数据库系统性能的过程中,总会涉及到跟踪效率低下的SQL语句,Oracle数据库10g包含一种新的实用程序trcsess,它可以让您基于会话ID或模块名称之类的条件,有选择地从大量跟踪文件中抽取出跟踪数据,并将它们保存到一个文件中。该实用程序在共享服务器配置中特别有用,因为调度程序可能把每一个用户请求传递给不同的共享服务器进程,从而为任何给定的会话产生多个跟踪文件。与通过大量跟踪文件发掘信息不同,Oracle数据库10g的trcsess可以让您获得关于单一用户会话的整合后的跟踪信息。现在就如何跟踪SQL 语句来做一个简单的总结。权做抛砖引玉之用。 如果我们可以修改应用系统的源代码,则可以直接在程序中加入如下的语句: 1)alter session set timed_statistics=true; /*适用于Oracle 8.1.7以后的版本*/ 2)alter session set max_dump_file_size=unlimited ; /*适用于Oracle 9i以后的版*/ 3)alter session set tracefile_identifier='POX20031031a'; /*适用于Oracle 9i以后的版本*/ 4)alter session set events '10046 trace name context forever, level 8'; /*在这里编写应用程序的代码*/ 5)alter session set events '10046 trace name context off'; 在上述语句中,语句1是把该会话的时间统计打开,该参数默认为false.在Oracle 9i之前的版本中,不能在会话级设置该参数,只能修改初始化文件然后重新启动数据库,这样将在实例级打开时间统计。 语句2是把跟踪文件的大小设置成操作系统所允许的最大尺寸,这样可以防止跟踪文件在完成所需要的跟踪之前被填充满,此外需要注意的是确保存放跟踪文件的目录要有足够的空间,否则将会收到“文件系统已满”错误。 语句3的作用是使生成的跟踪文件名称中包含'POX20031031a'字符串,这样可以使你很容易的找到所需的跟踪文件,该参数在Oracle 9i之后可用。 语句4和语句5的作用分别是打开和关闭跟SQL跟踪,你可以在这两个语句之间写入应用程序的代码,这些代码的执行情况都将被跟踪。需要注意的是语句4)的level关键字,它用来指定跟踪级别,一共有0,1,2,4,8,12六个级别可以设置,0相当于关闭跟踪;1是输出一般的跟踪信息,不包括绑定变量和等待信息;2和1相同;4是在级别1的基础上增加绑定变量信息;8是在级别1的基础上增加等待信息;级别12是输出包含级别1,4,8的所有信息。 如果应用程序的代码无法修改或者是不想去修改,则可以在其他会话中打开对特定会话的跟踪,方法如下: sys.dbms_system.set_bool_param_in_session(:sid,:serial,'timed_statistics', true); sys.dbms_system.set_int_param_in_session( :sid,:serial,'max_dump_file_size', 2147483647); 打开和关闭跟踪的第一种方法(oracle推荐):

大数据的库基本SQL语句大全

数据库基本SQL语句大全 数据库基本----SQL语句大全 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.d at' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 typ e2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2…from tab_old defini tion only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键:Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement

Oracle习题

(2)在employee表的ename列上创建非唯一性索引。 SQL>CREATE INDEX emp_ename_index ON employee(ename); (3)在employee表的empno列上创建唯一性索引。 SQL>CREATE UNIQUE INDEX emp_empno_index ON employee(empno); (4)在employee表的job列上创建反序索引。 SQL>CREATE INDEX emp_job_index ON employee(job) REVERSE; (5)在employee表的ename列上创建基于名字大写的函数索引。 SQL>CREATE INDEX emp_func_ename_index ON employee(UPPER(ename)); (6)在employee表的sex列上创建位图索引。 SQL>CREATE BITMAP INDEX emp_sex_index ON employee(sex); (7)在employee表的deptno与job两列上创建复合索引。 SQL>CREATE INDEX emp_deptno_job_index ON employee(deptno,job); 7.3.2 用户权限的直接授予与回收 (3)为用户userA授予CREATE SESSION系统权限,授予scott.emp表上的SELECT、UPDATE、DELETE对象权限。 SQL>GRANT CREATE SESSION TO userA; SQL>GRANT SELECT,UPDATE,DELETE ON scott.emp TO userA; (4)为用户userA授予CREATE TABLE权限,以及 scott.dept表上的SELECT权限,都可以传递。 SQL>GRANT CREATE TABLE TO userA WITH ADMIN OPTION; SQL>GRANT SELECT ON scott.dept TO userA WITH GRANT OPTION; (5)为public用户组授予CREATE SESSION系统权限。 SQL>GRANT CREATE SESSION TO PUBLIC; (6)查询用户userA所具有的对象权限和系统权限详细信息。 SQL>SELECT * FROM dba_tab_privs WHERE grantee='USERA'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCH SQL>SELECT * FROM dba_sys_privs WHERE grantee='USERA'; (7)查询用户组PUBLIC所具有的系统权限信息。 SQL>SELECT * FROM dba_sys_privs WHERE grantee='PUBLIC'; (8)将用户userA解锁后,试利用该用户登录,并访问scott.emp表,修改scott.dept表。 SQL>ALTER USER usera ACCOUNT UNLOCK; SQL>CONN userA/userA SQL>SELECT * FROM scott.emp; SQL>UPDATE scott.dept SET loc='china' WHERE deptno=10; UPDATE scott.dept SET loc='china' WHERE deptno=10 (9)以userA用户连接数据库后,为userB用户授予CREATE TABLE系统权限以及scott.dept表上的SELECT权限。 SQL>CONN userA/userA SQL>GRANT CREATE TABLE TO userB; SQL>GRANT SELECT ON scott.dept TO userB; (10)查询用户userB所具有的对象权限和系统权限详细 信息。提示:重新连接到创建userB用户的数据库模式) SQL>SELECT * FROM dba_tab_privs WHERE grantee='USERB'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY (11)以用户userB连接数据库,创建一个表,并访问 scott.dept表。 SQL>CONN userB/userB SQL>CREATE TABLE test1( ID NUMBER, info VARCHAR2(20)); SQL>SELECT * FROM scott.dept; (12)回收用户userA的CREATE TABLE系统权限以及在 scott.dept上的SELECT系统权限,然后检测userB的权限。 SQL>CONN / AS SYSDBA SQL>REVOKE CREATE TABLE FROM userA; SQL>REVOKE SELECT ON scott.dept FROM userA; SQL>SELECT * FROM dba_sys_privs WHERE grantee='USERB'; 1.3.1 PL/SQL显示游标 1.根据输入的部门号查询某个部门的员工信息,部门 号在程序运行时指定。由于某个部门的人数是不定的,可能有 多个,因此需要采用游标来处理。 12.查询名为SMITH的员工工资,如果该员工不存在, 则输出"There is not such an employee!";如果存在多个同 名的员工,则输出其员工号和工资。 13.删除dept表中部门号为10的部门信息,如果不能删除则 输出"There are subrecords in emp table!"。 1创建服务器初始化参数文件语句 Create spfile [=’path’] from pfile=’path’ 2 修改服务器参数文件的参数 Alter system set parameter_name=value scope=[spfile(服 务器初始化参数文件)|memory(文本初始化参数文件)|both] 3查看初始化参数设置 Sql>Show parameters Or Select name,value from v$parameter where name=’db_files’ 4 导出服务器初始化参数文件 Create pfile [=’path’] from spfile[=’path’] 5 Sql*plus连接命令 Connect system/manage@orcl 修改用户口令 Sql>Connect scott/tiger@orcl Sql>password scott 6 Sql*plus编辑命令 显示缓冲区Sql>list 1* select * from emp 执行缓冲区Run 清除缓冲区Clear buffer 7 执行脚本文件Start c:\sqlscript 2.查询并输出某个部门的员工信息。

相关主题