1.pl/sql是一种什么语言?
是结合了Oracle过程语言和结构化查询语言(sql)的一种扩展语言。
2.构成pl/sql程序的基本单元是什么?
逻辑块(如过程、函数或匿名块),该逻辑块可以包含任何数量的嵌套子块,每个逻辑块对应要解决的问题或子问题。
3.pl/sql块中的匿名块是什么意思?
是一个未在数据库中命名的PL/SQL块,在运行时被传递到PL/SQL引擎以便执行。
4.pl/sql块由哪几部分组成?
声明部分、可执行部分、异常处理部分
5.pl/sql块中能不能使用ddl语句?
不能,能使用DML、TCL语句。
6.<<>>在pl/sql块中是用来作什么的?
标签分隔符(goto跳转)
7.在pl/sql中如何给一个变量赋值?
declare num number := 20;
8.请定义vqrchar2类型变量,长度20,初始值为china?
declare aaa varchar2(20) := 'china';
9.数据类型positive,positiven,signtype,real,float,integer,pls_integer分别是什么意思?可用在什么地方?
positive: 可以限制变量存储正整数
positiven: 正整数,且非空
signtype: 只存储值 -1、0、1三个值
real: 用于声明最高精度为63位的二进制数字(大约相当于18位十进制数字)的浮点数
float: 声明最高精度为126位的二进制数字(大约相当于38位十进制数字)的浮点数
integer: 声明最高精度为38位的十进制数字的整数
pls_integer: 存储带符号的整数,范围介于-2的31次方到2的31次方之间。与number和binary_integer类型相比,它执行运算的速度更快,需要的存储空间更小。
10.raw用来存储什么类型的数据,它的最大长度是多少?可以将raw类型的变量插入到数据库表的raw类型字段中吗?
用于存储二进制数据或字节串,最大长度是32767个字节,但数据库RAW列的最大长度是2000个字节,因此,不能向RAW列中插入长度大于2000个字节的值。
11.pl/sql下的long是什么类型,长度是多少?
可变长度字符串,最大长度是32760个字节。
12.long raw变量和long raw列有什么区别?
long raw变量的最大长度是32760个字节。
long raw列的最大长度是2GB。
13.lob数据类型的数据库列存储的内容是什么?
lob数据类型的数据库列用于存储定位器,而该定位器指向大型对象的存储位置。这些大型对象可以存储在数据库中,也可以存储在外部文件中(BFILE)。
14.空Lob指的是一个什么样的lob?它是什么函数来完成的?
可以将LOB列值初始化为NULL或空(EMPTY)。当LOB值为NULL时,它不包含定位器,而空LOB是一个具有定位器且长度为零的LOB。
如果选择空的LOB列,则返回一个定位器,它可以通过DBMS_LOB程序包用数据填充LOB。
可以在INSERT或UPDATE语句中使用特殊函数(如EMPTY_BLOB()和EMPTY_CLOB())将NULL或非NULL的LOB初始化为空。
15.如何向BFILE类型的列中插入数据?如有表books(chapter varchar2(10),content bfile),如何向表中插入一条数据chapter='chapter 1',content指向c:\bookdata\book01.doc文件呢.写出完成步骤?
考虑如何将此文件读取出来呢?并存为本机的另一文件呢?
create directory book_ajh as 'c:\bookdata';
craate table books(chapter varchar2(10),content bfile);
insert into book values('chapter 1',bfilename('book_ajh','book01.txt'));
16.有表student(stuid varchar(2),pic blob),如何向表中插入一条数据stuid=0001,pic的内容为c:\bookdata\image\0001.jpg呢?写入完整步骤?
考虑如何将此内容读取出来呢,并存为本机的另一文件呢?
create table student(stuid varchar(2),pic blob);
create directory stu_ajh as 'c:\bookdata\image';
grant read on directory stu_ajh to ajh;
declare
l_bfile bfile;
l_blob blob;
begin
insert into student(stuid,pic) values('0001',empty_blob())
return pic into l_blob;
l_bfile := bfilename('STU_AJH','\0001.JPG');
dbms_lob.open(l_bfile,dbms_lob.file_readonly);
dbms_lob.loadfromfile(l_blob,l_bfile,
dbms_lob.getlength(l_bfile));
dbms_lob.close(l_bfile);
commit;
end;
17.有表student(stuid varchar(2),memo clob),如何向表中插入一条数据stuid=0001,memo的内容为c:\bookdata\memo\0001.dat呢?写入完整步骤?
考虑如何将此内容读取出来呢,并存为本机的另一文件呢?
create table student(stuid varchar(2),memo clob);
create directory stu_clob as 'c:\bookdata\memo';
grant read on directory stu_clob to ajh;
declare
l_bfile bfile;
l_clob clob;
begin
insert into student(stuid,memo) values('01',empty_clob())
return memo into l_clob;
l_bfile := bfilename('STU_CLOB','\0001.txt');
dbms_lob.open(l_bfile,dbms_lob.file_readonly);
dbms_lob.loadfromfile(l_clob,l_bfile,
dbms_lob.getlength(l_bfile));
dbms_lob.close(l_bfile);
commit;
end;
declare
clob_var clob;
amount integer;
offset integer;
output_var varchar2(1000);
begin
select memo into clob_var
from student where stuid = '04';
amount := 24;
offset := 1;
dbms_lob.read(clob_var,amount,offset,output_var);
dbms_output.put_line(output_var);
end;
18.如何来定义一个变量,使它与表student中的mark字段同类型,以致将来在修改mark字段的类型时不用再修改变量的类型。
mark_ajh student.mark%type;
19.如何来定义一个变量,使它与先前定义的变量nowMoney同类型?
money_ajh nowMoney%type;
20.在学习下一章时,我们将用到游标,游标为我们提供了依次访问行的机制,在SQL SERVER中我们是分别依据每个字段定义变量,再将当前游标的字段值取到我们的变量中,此时,当我们在游标中增加字段时,我们还需增加变量的定义,同时还要修改fetch操作中的变量,在oracle中有什么好的方法吗?现有表student,如何来定义变量呢?
student_ajh student%rowtype;
21.if ... then ...end if
22.if ...then
....
elseif ... then
...
end if
正确吗?
不正确,应该是:
if ... then
...
elsif ... then
...
end if
23.declare
a natural;
begin
a:='&a';
if a=1 then
else
dbms_output.put_line(a);
end if;
end;
以上语句正确吗?
错误,then后面不能没有语句,可写为 null;
24.set serveroutput on 有什么含义?
打开输出显示
25.以下语句正确吗?
case a
when '1' then ....;
when '2' then ....;
default .....;
end case;
错在哪儿?
不能用default,应为else
26.如果写一个case语句来判断成绩信息mark,当大于90时输出'优秀',大于80时输出‘良好’,大于70时输出一般,大于60输出及格,小于60时输出未通过?
declare
mark number;
begin
mark := &mark;
case
when mark > 90 then dbms_output.put_line('优秀');
when mark > 80 then dbms_output.put_line('良好');
when mark > 70 then dbms_output.put_line('一般');
when mark > 60 then dbms_output.put_line('及格');
else dbms_output.put_line('未通过');
end case;
end;
27.case和decode语句有什么区别?分别在什么场合使用?
decode 是将值进行替换。P61
case 是当满足某一条件时,执行一定的语句。
28.基本的循环语句格式是什么?如何退出循环?
loop ... end loop;
while 条件 loop ...end loop;
for 变量 in value1..value2 loop ... end loop;
29.oracle下的循环语句有哪几种,有什么共同的地方?
见上题。
30.请建表student(stuid varchar2(5),stuname varchar2(20),clsid varchar2(6),mark number(4,1)),写一个循环语句向表中插入1000行数据,stuid,stuname使用dbms_random包的string函数来生成值,mark用value来生成值,clsid要求是vb,sql,c#,oracle,c内容。
declare
clsid_num number(1,0);
begin
for i in 1..1000
loop
clsid_num := dbms_random.value() * 4;
insert into student values(dbms_random.string('a',2),
dbms_random.string('A',10),
decode(clsid_num,0,'vb',1,'sql',2,'C#',3,'Oracle',4,'c'),
dbms_random.value() * 100);
end loop;
end;
31.oracle的标签语句是什么?如何来标识一个标签?标签后可以没有语句吗?
goto
<<>>
标签后不可以没有语句,可以为NULL
32.begin
a:=1
if a=1 then
goto ta;
else
goto tb;
end if;
<<ta>>
dbms_output.put_line('aaaaa');
goto quit;
<<tb>>
dbms_output.put_line('bbbbb');
<<quit>>
null;
end;
请问上面语句会输出什么?有什么改进方法吗?
需在begin前面定义a变量 declare a number;
a:=1;后需要分号
会输出aaaaa bbbbb
需在<<ta>>后加上goto quit,否则会继续执行bbbbb.
33.如何来运行动态的SQL语句?动态的SQL语句是指什么?运行时有什么限制?
execute immediate
动态SQL语句是指在PL/SQL块编译时SQL语句是不确定的,编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
只能用于处理返回单行或没有返回的SQL语句,要处理返回多行的动态SQL需使用REF游标的OPEN...FOR语句。
34.如何在运行动态的SQL语句时指定参数?
插入
declare
sql_stu varchar2(100);
stu_