一、Oracle中的数据类型
1、字符串类型。如:char、nchar、varchar2、nvarchar2。
2、数值类型。如:int、number(p,s)、integer、smallint。
3、日期类型。如:date、interval、timestamp。
4、PL/SQL类型。如:pls_integer、binary_integer、binary_double(10g)、binary_float(10g)、boolean。plsql类型是不能在sql环境中使用的,比如建表时。
5、自定义类型。利用 TYPE 定义;一个type 就像是复合变量: 个人理解这个type 就是一个数组一样,不过他返回值只有一个值。而且需要赋值
select to_char(sysdate,‘yy-mm-dd hh24:mi:ss‘) from dual //显示:08-11-07 13:22:42
select to_date(‘2005-12-25,13:25:59‘,‘yyyy-mm-dd,hh24:mi:ss‘) from dual //显示:2005-12-25 13:25:59
而如果把上式写作:select to_date(‘2005-12-25,13:25:59‘,‘yyyy-mm-dd,hh:mi:ss‘) from dual,则会报错,因为小时hh是12进制,13为非法输入,不能匹配。
二、PL/SQL语句块
是一个块结构,划分为:声明部分、 执行部分、 异常处理部分三部分。如下
1、声明变量:
变量名 [CONSTANT] 变量类型 [[NOT NULL] :=|DEFAULT expression]; //与SqlServer不同,变量名前无需@
注:
- CONSTANT:常量;
- NOT NULL:约束条件,若有,则初始化必须赋值;
- := 赋值符号;直接赋上默认值。
例:
declare
a varchar2(20):=‘12‘;
sqltable varchar(200);
sqlText varchar(1000);
2、执行部分
用于逻辑运算和查询等,常用语句:Dbms_output.put_line(‘1‘); --类似于SqlServer中的 print。
3、异常处理
三、基本操作
1、
2、查看字段类型
select * From all_tab_columns where table_name=upper(‘表名‘);
3、is与as
在 存储过程 和 函数 中没有区别;在 视图 中只能用 AS 不能用 IS ;在 游标 中只能用 IS 不能用 AS 。 从其定义也可以看出没什么区别。
create [or replace] procedure procedure_name
[(parameter_name [in | out | in out] type [,........])]
{is | as}
begin
procedure_body
end procedure_name;
5、EXECUTE IMMEDIATE。代替了以前Oracle8i中DBMS_SQL package包,它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块。
使用技巧:
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE
IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据
2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.
3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号;
4.举例:execute immediate ‘select count(1) from tempA‘。
问题:如何让过程返回数据集?
回答:
关键有两点:一是使用out类型的参数。二是该参数使用特殊数据类型:系统引用游标类型(sys_refCursor)。
过程返回数据集,可以在PL/SQL程序中由另一个块或过程接收;
问题:cursor类型与sys_refCursor类型有什么区别?
回答:
Cursor是游标类型,代表是数据集本身,只能在PL/SQL程序中关闭;可以通过游标FOR循环或者定义cursor来完成。
而sys_refCursor代表的是游标的引用,即数据集的引用地址,只能通过open for语句来完成。
两者的最大区别是后者可以将这个地址传递给其它程序。
问题:据说“ref cursor类型”也能够返回数据集,与sys_refCursor有什么关系?
回答: ref cursor是Oracle旧版本中使用的数据类型,用这种对象的缺点在于必须在包中定义;而现在用ys_refCursor类型,可以直接使用。