learning pl/sql (1) Basic

本文介绍了PL/SQL的基础内容,包括程序结构(匿名块、过程、函数)、数据类型(字符串、数字、日期、逻辑)、运算符、选择结构(if和case语句)、循环结构(for、无限循环、while),还提及了SQL*Plus的配置、Oracle数据库表查看及监听器配置等知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(清屏,相当于DOScls,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;}

 

 

 

 

一个打印26次幂:

 

 

-- 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./*…*/

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值