first program: hello, world
begin
dbms_output.put_line('Hello, world');
end;
/
在sql*plus里面,显示输出:
set serveroutput on(默认关闭)
新建立/编辑*.sql 文件
输入:edit hello.sql
在文本编辑器里编辑:
set serveroutput on
begin
dbms_output.put_line('Hello, world!');
end;
/
运行:@*.sql
退出
exit
输入上次输入的命令:/ (在command里面是上箭头)
pl/sql的程序结构:
1. 匿名块
2. 过程
3. 函数
匿名块
(我们刚刚写过的 begin dbms_output.put_line(‘***’); end;)
第一种匿名块:
BEGIN
statement;
end;
第二种:
Declare
declarations
begin
statements
end;
块可以嵌套
过程和函数
区别在于是否有返回值?
建立函数function1:
create function function1
return varchar2
as
begin
return 'hello,world';
end;
/
compile:SQL> @function1
run:
SQL> begin
2 dbms_output.put_line(function1);
3 end;
4 /
Plsql里的数据类型
字符串,数字,日期,逻辑
varchar2:
name varchar2(length),
length 范围: 1-32767 bytes
一个比较varchar2字符串的程序:
1 declare
2 small_string varchar2(4);
3 line_of_text varchar2(2000);
4 biggest_string_allowed varchar2(32767);
5 begin
6 biggest_string_allowed:='Tiny';-- notice :=
7 line_of_text :='Tiny';
8 if biggest_string_allowed=line_of_text
9 then
10 dbms_output.put_line('they match');
11 end if;
12* end;
13 /
output: they match
name varchar2(20000);
name:=’moonsoft’;
实际不会分配那么大内存给name ,而是作为动态分配
如果要存储的字符串很大,用blob(二进制)/clob(文本),在jsp编程里用过的(上传照片和写论坛).比较麻烦.
number:
整数和小数,比JAVA/C int ,long,float ,double 简单得多
有效位的规定
PLS_integer
date:
SQL> select sysdate from dual;
SYSDATE
----------
11-10月-05
SQL> select systimestamp from dual;
select systimestamp from dual
*
ERROR 在行 1:
ORA-00904: 資料欄名稱無效
SQL> select to_char(sysdate, 'yyyy-mon-dd')
2 from dual;
TO_CHAR(SYSD
------------
2005-10月-11
boolean:
值的初始化:
constant
:=/default
如果不初始值,其值将为null,而不是java里的0!!!
常见的运算符:
只写和C/Java 里不习惯的吧
:= 赋值(=)
没有除余, 用mod代替
以下是一个测试代码的除和除余:
1 declare
2 i pls_integer:=27;
3 j number(4):=4;
4 begin
5 dbms_output.put_line(i/j);
6 dbms_output.put_line(i mod j);
7* end;
注意:
1. declare 后面的每句话用分号表示
2. begin 和 end 中间的每句话也用分号表示
=等同 if(a==b)
** 表示平方
AND logic 与(&&)
OR logic 或(||)
NOT logic 非(!)
in 测试相当,取逻辑或
between 范围测试
is null if(x==null) 或更简洁if(x)//c
is not null if(x!=null)
like % _ 通配符匹配
|| 连结字符串
程序结构
选择:
if
then --相当于{}在类C语言里 then 后面的语句要加 ;
elsif --else if , 但是必需写成elsif
then --相当于{}在类C语言里 then 后面的语句要加 ;
else --这里不要then 了!!!
end if;
if salary=800 or 1000 -- error must be write as : if salary=800 or salary=1000
if salary between 800 and 1000 - -这是正确的,但是这里有无数个值
翻译成类C语言:
if(salary= =800||salary= =1000)
if(salary>=800&&salary<=1000)
一个工资的小例子:
1 declare
2 salary pls_integer:=5800;
3 bonus pls_integer default 0;
4 begin
5 if salary between 1000 and 4000
6 then bonus:=500;
7 elsif salary>4000 and salary<=10000
8 then bonus:=1000;
9 else
10 bonus:=0;
11 end if;
12 dbms_output.put_line(salary+bonus);
13* end;
选择结构之Case 语句:
java 中的case 语句
select (a)
{
case 1: do something; break;
case2: do something ; break;
….
default: do something;
}
我不大喜欢case, 除非有多种情况可以选择,否则我宁愿用if/else if /else
在pl/sql中的语法:
case
when conditions then do sth;
when conditions then do sth;
else—相当于default
do sth;
end case;
其中在pl/sql 中case 语句包括两种: 简单型 和搜索型
其中简单型只能进行相等比较,而搜索型可以如下使用(上面那个bonus例子用搜索型case 语句表示):
declare
salary pls_integer := 5800;
bonus pls_integer default 0;
begin
/* if salary between 1000 and 4000
then bonus:=500;
elsif salary>4000 and salary<=10000
then bonus:=1000;
else
bonus:=0;
end if;*/
case
when salary between 1000 and 4000 then
bonus := 500;
when salary > 4000 and salary <= 10000 then
bonus := 1000;
else
bonus := 0;
end case;
dbms_output.put_line(salary + bonus);
end;
/
学到几个关于sql/plus的配置:
clear(清屏,相当于DOS的cls,在sqlplus 不管用,在pl/sqldeveloper里管用)
在cmd里输入:
sqlplus /nolog 不登录到系统
conn user/pw@sid 登录
desc tabs; //显示oracle 数据库表的表(所有表都在那里)
配置监听器:
# TNSNAMES.ORA Network Configuration File: d:/orant/network/admin/tnsnames.ora - -path
# Generated by Oracle configuration tools.
ASDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.26.250)(PORT = 1521))
)
(CONNECT_DATA =
(SID = asdb)- - notice
)
)
test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.36.253)(PORT = 1524))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
循环
For 循环
for i in 1 ..6
loop
do sth;
end loop;
感觉没有括号的语言就是麻烦,如java里面的
for(int i=0; i<=6; i++)
{do sth;}
一个打印2的6次幂:
-- create function jiecheng1
--return pls_integer
--as
declare
i pls_integer :=1;--这里使用的数据类型是pl/sql里,
--而作为函数存到oracle 是不行的
j pls_integer :=1;
begin
for j in 1..6
loop
i:=i*2;
end loop;
dbms_output.put_line(i);
end;
/
上面的如果不注释掉就会有编译错误.难道在function 里不能进行声明????我去csdn问了,还没有人给正确的回答
i pls_integer :=1;--这里使用的数据类型是pl/sql里,
--而作为函数存到oracle 是不行的
简单的无限循环,如果没有exit 的话
declare
i pls_integer:=1;
j pls_integer:=1;
begin
loop
i:=i*2;
j:=j+1;
exit when j>6;
end loop;
dbms_output.put_line(i);
end;
--set serveroutput on
/*begin
dbms_output.put_line(jiecheng2);
end;*/
declare
i number :=1;
j number :=1;
begin
while j<=6
loop
i:= i*2;
j:=j+1;
Dbms_output.put_line(j);
Dbms_output.put_line(i);
end loop;
Dbms_output.put_line(i);
end;
以上是基础知识
注释:
1.--
2./*…*/