??xml version="1.0" encoding="utf-8" standalone="yes"?>国产在线不卡一区二区三区,色综合咪咪久久,日本一区免费网站http://www.aygfsteel.com/lingy/category/39870.htmlzh-cnWed, 18 Aug 2010 23:12:54 GMTWed, 18 Aug 2010 23:12:54 GMT60Oracle DDL,DML,DCL,TCL 基础概念 http://www.aygfsteel.com/lingy/archive/2010/08/17/329116.html林光?/dc:creator>林光?/author>Tue, 17 Aug 2010 08:50:00 GMThttp://www.aygfsteel.com/lingy/archive/2010/08/17/329116.htmlDDL
Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:
  • CREATE - to create objects in the database
  • ALTER - alters the structure of the database
  • DROP - delete objects from the database
  • TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed
  • COMMENT - add comments to the data dictionary
  • RENAME - rename an object

DML

Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:
  • SELECT - retrieve data from the a database
  • INSERT - insert data into a table
  • UPDATE - updates existing data within a table
  • DELETE - deletes all records from a table, the space for the records remain
  • MERGE - UPSERT operation (insert or update)
  • CALL - call a PL/SQL or Java subprogram
  • EXPLAIN PLAN - explain access path to data
  • LOCK TABLE - control concurrency

DCL

Data Control Language (DCL) statements. Some examples:
  • GRANT - gives user's access privileges to database
  • REVOKE - withdraw access privileges given with the GRANT command

TCL

Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.
  • COMMIT - save work done
  • SAVEPOINT - identify a point in a transaction to which you can later roll back
  • ROLLBACK - restore database to original since the last COMMIT
  • SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use


作者:李敬ӞGnieQ?br /> 出处Q?a >{GnieTech} Qhttp://www.cnblogs.com/gnielee/Q?br /> 版权声明Q本文的版权归作者与博客园共有。{载时L明本文的详细链接Q否则作者将保留q究其法律责仅R?/p>

]]>
oracle 回滚 sql操作http://www.aygfsteel.com/lingy/archive/2010/06/02/322585.html林光?/dc:creator>林光?/author>Wed, 02 Jun 2010 08:31:00 GMThttp://www.aygfsteel.com/lingy/archive/2010/06/02/322585.html

]]>
树结构和它的专用函数SYS_CONNECT_BY_PATHhttp://www.aygfsteel.com/lingy/archive/2009/09/20/295773.html林光?/dc:creator>林光?/author>Sun, 20 Sep 2009 13:32:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/09/20/295773.html 关于树的普通应?br /> 学习了下q个函数, 用ORGINDUSTRIES的表做了个测?
正常的树型结?br /> select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=1
connect by pindid=prior indid
l果昄如下
                 Indlevel  indid    pindid
        服装与服?nbsp;              1             1             0
              服装               2             2               1
                    奌        3             3               2

倒型?br /> 下面q个例子是个”倒数”—倒过来的树型l构
select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=20
connect by indid=prior pindid;
q是标准l果:
                             Indlevel indid    pindid
二手服装                      3        20       2
      服装                    2        2        1
            服装与服?nbsp;       1        1        0
l论
无论正树q是倒树, 关键在于connect by的条?
正树:  必须?nbsp; ‘?#8217;= prior ‘?#8217;
倒树:  必须?nbsp; ‘?#8217;= prior ‘?#8217;

树型l构的条件过?br /> 采用树型l构的话, 如果我们惛_树上的一个分支砍?  分支后面的l构都抛弃掉, q个可以实现麽?当然可以?但是不是用whereQ?where条g只能去除单一的条件?br /> 所以, q种树型的过滤条件就需要加在connect by上面?br />
试如下Q由于用真实环境比较贴近实际Q所以提前用下SYS_CONNECT_BY_PATH函数来显CZ环境

不加M条g的环境:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
start with areaname='中国大陆'
connect by parentareaid=prior areaid  

l果Q?br /> 1        中国大陆,中国大陆
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城?nbsp;       ,中国大陆,北京,东城?br /> 5        西城?nbsp;       ,中国大陆,北京,西城?br /> 22        q东        ,中国大陆,q东
23        q州        ,中国大陆,q东,q州
24        汕尾        ,中国大陆,q东,汕尾
25        潮阳        ,中国大陆,q东,潮阳
46        上v        ,中国大陆,上v
47        上v        ,中国大陆,上v,上v
48        黄?nbsp;       ,中国大陆,上v,黄?br /> 49        闸北?nbsp;       ,中国大陆,上v,闸北?br />

加了whereqo条g的SQL:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaid

l果为:
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城?nbsp;       ,中国大陆,北京,东城?br /> 5        西城?nbsp;       ,中国大陆,北京,西城?br /> 22        q东        ,中国大陆,q东
23        q州        ,中国大陆,q东,q州
24        汕尾        ,中国大陆,q东,汕尾
25        潮阳        ,中国大陆,q东,潮阳
46        上v        ,中国大陆,上v
47        上v        ,中国大陆,上v,上v
48        黄?nbsp;       ,中国大陆,上v,黄?br /> 49        闸北?nbsp;       ,中国大陆,上v,闸北?br />
l论Q去掉了“1        中国大陆,中国大陆”数据

加了connect by的过滤条Ӟ
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaid  and areaname<>'q东'

l果为:
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城?nbsp;       ,中国大陆,北京,东城?br /> 5        西城?nbsp;       ,中国大陆,北京,西城?br /> 46        上v        ,中国大陆,上v
47        上v        ,中国大陆,上v,上v
48        黄?nbsp;       ,中国大陆,上v,黄?br /> 49        闸北?nbsp;       ,中国大陆,上v,闸北?br />
l论Q去掉了整个q东的分支,  在结果集中只有北京和上v


SYS_CONNECT_BY_PATH函数
采用SYS_CONNECT_BY_PATH函数?

select industry,sys_connect_by_path(industry,'/')
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;

l果?
奌               /奌
服装               /奌/服装
服装与服?nbsp;           /奌/服装/服装与服?br />
q样的话, 可以实? 树结构的l果集的单行拼接:

我们只需要取最大的字段OK?br />
试如下Q?br />
select max(sys_connect_by_path(industry,'/'))
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;

l果为:
/奌/服装/服装与服?br />

复杂的树型结构――多列变单列
树型l构也分单树和多?我的U呼,实际上就是指单支和多?
对于下面的这U情况, 我们必须要构造的树就属于单支树?br /> 原始环境
环境如下Q?br /> select * from testQ?br />
l果为:
1        n1
1        n2
1        n3
1        n4
1        n5
3        t1
3        t2
3        t3
3        t4
3        t5
3        t6
2        m1

造树
脚本如下Q?br /> select no,q,
       no+row_number() over( order by no) rn,
       row_number() over(partition by no order by no) rn1
from test

l果如下Q?br /> No  Q  RN RN1
1        n1        2        1
1        n2        3        2
1        n3        4        3
1        n4        5        4
1        n5        6        5
2        m1        8        1
3        t1        10        1
3        t2        11        2
3        t3        12        3
3        t4        13        4
3        t5        14        5
3        t6        15        6

每列的目的是Q?br /> RN1列主要的目的是分l, 按照value?#8216;1’Q我们可以start with使用它?br />
RN列主要用来做connect by使用?实际上它是我们要的树?br /> W一个支Q?2Q?Q?Q?Q?
W二个支Q?8
W三个支Q?10Q?1Q?2Q?3Q?4Q?5

中间Z么要断掉Q?,9  目的是Z区别每个分支?到后面看具体的SQLQ就明白q里的说法了?br />
杀手锏
既然我们有了树, 可以用树型函数SYS_CONNECT_BY_PATH和connect by啦,来拼接我们所需要的多列倹{?br />
脚本如下Q?br /> select no,sys_connect_by_path(q,',')
from (
select no,q,
       no+row_number() over( order by no) rn,
       row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn

l果为:
1        ,n1
1        ,n1,n2
1        ,n1,n2,n3
1        ,n1,n2,n3,n4
1        ,n1,n2,n3,n4,n5
2        ,m1
3        ,t1
3        ,t1,t2
3        ,t1,t2,t3
3        ,t1,t2,t3,t4
3        ,t1,t2,t3,t4,t5
3        ,t1,t2,t3,t4,t5,t6

l极武器
最l我们要的|是单列| 其实xQ?也就是最长的一行咯?那么好办了?我们直接GROUP BY Q然后取MAX倹{?br /> 脚本如下Q?br /> select no,max(sys_connect_by_path(q,','))
from (
select no,q,
       no+row_number() over( order by no) rn,
       row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn
group by no

l果为:
1        ,n1,n2,n3,n4,n5
2        ,m1
3        ,t1,t2,t3,t4,t5,t6

如果觉得前面?#8216;Q?#8217;不好看,可以使用ltrimL?或者用substr也可以?br /> 如下Q?br /> ltrim(max(sys_connect_by_path(q,',')),',')
或?br /> substr(max(sys_connect_by_path(q,',')),2)


]]>
EXECUTE IMMEDIATE用法解 http://www.aygfsteel.com/lingy/archive/2009/07/16/287019.html林光?/dc:creator>林光?/author>Thu, 16 Jul 2009 11:42:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/07/16/287019.html 它解析ƈ马上执行动态的SQL语句或非q行时创建的PL/SQL?动态创建和执行SQL语句性能前QEXECUTE IMMEDIATE的目标在于减企业费用ƈ获得较高的性能Q较之以前它相当Ҏ~码.管DBMS_SQL仍然可用Q但是推荐用EXECUTE IMMEDIATE,因ؓ它获的收益在包之上?


-- 使用技?br />

1. EXECUTE IMMEDIATE不会提交一个DML事务执行Q应该显式提?br /> 如果通过EXECUTE IMMEDIATE处理DML命oQ?br /> 那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分.
如果通过EXECUTE IMMEDIATE处理DDL命o,它提交所有以前改变的数据


2. 不支持返回多行的查询,q种交互用临时表来存储记录(参照例子如下)或者用REF cursors.


3. 当执行SQL语句Ӟ不要用分P当执行PL/SQL块时Q在其尾部用分号.


4. 在Oracle手册中,未详l覆盖这些功能?br /> 下面的例子展CZ所有用到Execute immediate的可能方?希望能给你带来方?


5. 对于Forms开发?当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功?


EXECUTE IMMEDIATE -- 用法例子


1. 在PL/SQLq行DDL语句


begin
   execute immediate 'set role all';
end;


2. l动态语句传?USING 子句)


declare
   l_depnam varchar2(20) := 'testing';
   l_loc     varchar2(10) := 'Dubai';
   begin
   execute immediate 'insert into dept values   (:1, :2, :3)'
     using 50, l_depnam, l_loc;
   commit;
end;


3. 从动态语句检索?INTO子句)


declare
   l_cnt     varchar2(20);
begin
   execute immediate 'select count(1) from emp'
     into l_cnt;
   dbms_output.put_line(l_cnt);
end;


4. 动态调用例E?例程中用到的l定变量参数必须指定参数cd.
黓认为INcd,其它cd必须昑ּ指定


declare
   l_routin    varchar2(100) := 'gen2161.get_rowcnt';
   l_tblnam    varchar2(20) := 'emp';
   l_cnt       number;
   l_status    varchar2(200);
begin
   execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
     using in l_tblnam, out l_cnt, in out l_status;

   if l_status != 'OK' then
      dbms_output.put_line('error');
   end if;
end;


5. 返回g递到PL/SQL记录cd;同样也可?rowtype变量


declare
   type empdtlrec is record (empno   number(4),
                            ename   varchar2(20),
                            deptno   number(2));
   empdtl empdtlrec;
begin
   execute immediate 'select empno, ename, deptno ' ||
                    'from emp where empno = 7934'
     into empdtl;
end;


6. 传递ƈ索?INTO子句用在USING子句?br />

declare
   l_dept     pls_integer := 20;
   l_nam      varchar2(20);
   l_loc      varchar2(20);
begin
   execute immediate 'select dname, loc from dept where deptno = :1'
     into l_nam, l_loc
     using l_dept ;
end;


7. 多行查询选项.Ҏ选项用insert语句填充临时表,
用时表q行q一步的处理,也可以用REF cursorsU正此缺?

declare
   l_sal    pls_integer := 2000;
begin
   execute immediate 'insert into temp(empno, ename) ' ||
                    '           select empno, ename from emp ' ||
                    '           where   sal > :1'
     using l_sal;
   commit;
end;


        对于处理动态语?EXECUTE IMMEDIATE 比以前可能用到的更容易ƈ且更高效.
当意图执行动态语句时Q适当地处理异常更加重?应该x于捕h有可能的异常.
我是无聊的hQ所以做无聊的事情?/em>


]]>
使用 TRUNCATE TABLE 删除所有行http://www.aygfsteel.com/lingy/archive/2009/07/16/287018.html林光?/dc:creator>林光?/author>Thu, 16 Jul 2009 11:41:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/07/16/287018.html
SQL Server 2008 联机丛书Q?009 q?5 月)
使用 TRUNCATE TABLE 删除所有行

若要删除表中的所有行Q则 TRUNCATE TABLE 语句是一U快速、有效的Ҏ。TRUNCATE TABLE 与不?WHERE 子句?DELETE 语句cM。但是,TRUNCATE TABLE 速度更快Qƈ且用更的pȝ资源和事务日志资源?/p>

?DELETE 语句相比QTRUNCATE TABLE h以下优点Q?/p>

  • 所用的事务日志I间较少?br /> DELETE 语句每次删除一行,q在事务日志中ؓ所删除的每行记录一个项。TRUNCATE TABLE 通过释放用于存储表数据的数据|删除数据Qƈ且在事务日志中只记录释放?br />
  • 使用的锁通常较少?br /> 当用行锁执?DELETE 语句Ӟ锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和,而不是锁定各行?br />
  • 如无例外Q在表中不会留有Mc?br /> 执行 DELETE 语句后,表仍会包含空c例如,必须臛_使用一个排?(LCK_M_X) 表锁Q才能释攑֠中的I。如果执行删除操作时没有使用表锁Q表Q堆Q中包含许多空c对于烦引,删除操作会留下一些空,管q些会通过后台清除q程q速释放?br />

?DELETE 语句相同Q?TRUNCATE TABLE 清空的表的定义与其烦引和其他兌对象一起保留在数据库中。如果表中包含标识列Q该列的计数器将重置列定义的U子倹{如果未定义U子Q则使用默认?1。若要保留标识计数器Q请使用 DELETE?/p>

 截断大型?

Microsoft SQL Server 引入一U功能,此功能可删除或截断超q?128 个区的表Q而无需同时保留需要删除的所有区的锁。有兌l信息,请参?a id="ctl00_MTContentSelector1_mainContentContainer_ctl04" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_cpe28768_c|ctl00_MTContentSelector1_mainContentContainer_ctl04',this);" >删除q新生成大型对?/a>?/p>

 CZ

下面的示例删?JobCandidate 表中的所有数据。在 TRUNCATE TABLE 语句之前和之后?SELECT 语句来比较结果?/p>

USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO


]]>
over partition by与group by 的区?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/29/284658.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Mon, 29 Jun 2009 11:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/29/284658.html</guid><description><![CDATA[<div class="wmqeeuq" id="message10586007" class="t_msgfont">各位好!<br /> over partition by ?group by 都是与统计类函数用,q两个有什么区别呢Q?br /> 目前我只知道一个这L区别Q?br /> 比如有一张表saraly:CREATE TABLE SALARY AS SELECT 'A' NAME,10 DEPT,1000 SALARY FROM DUAL UNION ALL SELECT 'B',10,2000 FROM DUAL UNION ALL SELECT 'C' ,20,1500 FROM DUAL UNION ALL SELECT 'D',20,3000 FROM DUAL UNION ALL<br /> SELECT 'E',10,1000 FROM DUAL;<br /> NAME DEPT SALARY<br /> A         10     1000<br /> B         10     2000<br /> C         20     1500<br /> D         20     3000<br /> E         10     1000   <br /> 用over partition by 我就可以查询到每位员工本来的具体信息和它所在部门的d资:<br /> select name,dept,salary,sum(salary) over (partition by dept) total_salary from salary;  <br /> name       dept         salary      tatal_salary<br /> A        10        1000        4000<br /> B        10        2000        4000<br /> E        10        1000        4000<br /> C        20        1500        4500<br /> D        20        3000        4500<br /> <br /> 用goup by 没办法做到q点Q只能查询到每个部门的d资:<br /> select dept,sum(salary) total_salary from salary group by dept<br /> dept        total_salary<br /> 10        4000<br /> 20        4500<br /> 另外over partion by q可以做到查询每位员工占部门d资的癑ֈ比:<br /> select name,dept,salary,salary*100/sum(salary) over (partition by dept) percent from salary;<br /> <br /> name       dept         salary     percent<br /> A        10        1000        25<br /> B        10        2000        50<br /> E        10        1000        25<br /> C        20        1500        33.3333333333333<br /> D        20        3000        66.6666666666667<br /> 用group by 也没办法做到q个.不知道我的理解正不正,请各位朋友指点,特别是over partition by 与group by 的更多区别请各位一起分享,谢谢Q?br /> <br /> 20        4500<br /> <br /> </div> <img src ="http://www.aygfsteel.com/lingy/aggbug/284658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-29 19:04 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/29/284658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的NULLQ八Q?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/29/284559.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Mon, 29 Jun 2009 02:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/29/284559.html</guid><description><![CDATA[<p style="text-indent: 21pt"><span style="font-family: 宋体">最q在论坛上经常看刎ͼ很多人提出和<span lang="EN-US">NULL有关的问题。NULL其实是数据库中特有的cdQOracle中很多容易出现的错误都是和NULL有关的?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">打算单的ȝ一?span lang="EN-US">NULL的相关知识?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">q一描qC下在<span lang="EN-US">SQL和PLSQL中一些处理NULL的一些问题?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ一Q:<a >http://yangtingkun.itpub.net/post/468/244434</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ二Q:<a >http://yangtingkun.itpub.net/post/468/245107</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ三Q:<a >http://yangtingkun.itpub.net/post/468/245259</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ四Q:<a >http://yangtingkun.itpub.net/post/468/245697</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ五Q:<a >http://yangtingkun.itpub.net/post/468/247492</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ六Q:<a >http://yangtingkun.itpub.net/post/468/251496</a></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">Oracle中的NULLQ七Q:<a >http://yangtingkun.itpub.net/post/468/258467</a></span></p> <p style="text-indent: 21pt"></p> <br /> <span style="display: none">8\![ Q!x;]$Yf0</span> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">NULL的最大的特点是两个NULL是不相等的。如果用{号来判断两个NULL是否相等得到的结果一定是NULL。从唯一U束的特点也可以看到Q对于徏立了唯一U束的列QOracle允许插入多个NULL|q时因ؓOracle不认些NULL是相{的?/span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> CREATE TABLE T (ID NUMBER, CONSTRAINT UN_T UNIQUE(ID));</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">表已创徏?/font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> INSERT INTO T VALUES (1);</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">已创?span lang="EN-US"> 1 行?/span></font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> INSERT INTO T VALUES (1);<br /> <span style="display: none">| Pw6I)A#P,x_0</span>INSERT INTO T VALUES (1)<br /> <span style="display: none">+h:w|3~ N0</span>*<br /> <span style="display: none">LCB-P#b{$C0</span>ERROR 位于W?1 ?<br /> <span style="display: none">f9i vJ Y%T0</span>ORA-00001: q反唯一U束条g (YANGTK.UN_T)</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><br /> <span style="display: none">&rSq _0P7QvYN0</span><font face="宋体">SQL> INSERT INTO T VALUES (NULL);</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">已创?span lang="EN-US"> 1 行?/span></font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> INSERT INTO T VALUES (NULL);</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">已创?span lang="EN-US"> 1 行?/span></font></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">但是有的时候,<span lang="EN-US">Oracle会认为NULL是相同的Q比如在GROUP BY和DISTINCT操作中。这个时候,Oracle会认为所有的NULL都是一cȝ?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">q有一U情况,是?span lang="EN-US">DECODE函数中。如果表辑ּ为DECODE(COL, NULL, 0, 1)Q那么如果COL的gؓNULLQOracle会认U情况与W二个参数的NULL值相匚wQ会q回0。不q这里只是给人感觉NULL值是相等的,Oracle在实现DECODE函数的时候,仍然是通过IS NULL的方式进行的判断?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">对于大多数的常用函数来说Q如果输入ؓ<span lang="EN-US">NULLQ则输出也是NULL。NVL、NVL2、DECODE和||操作是个例外。他们在输入参数为NULL的时候,l果可能不是NULL。不q归l其原因是因为,q些函数都有多个参数Q当多个参数不全为NULLӞl果可能不是NULLQ如果输入参数均为NULLQ那么得到的输出l果也是NULL?/span></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体" lang="EN-US">NULLq有一个特点,是一般聚集函C会处理NULL倹{不是MAX、MIN、AVGq是SUMQ这些聚集函数都不会处理NULL。注意这里说的不会处理NULLQ是指聚集函C直接忽略NULLD录的存在。除非是聚集函数处理的列中包含的全部记录都是NULLQ这U情况下Q上面这些聚集函Cq回NULL倹{?/span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> DELETE T WHERE ID = 1;</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">已删?span lang="EN-US"> 1 行?/span></font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> SELECT NVL(TO_CHAR(ID), 'NULL') FROM T;</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">NVL(TO_CHAR(ID),'NULL')<span style="display: none">ITPUB个hI间 Z,I Pa;o~)t/Tm7L</span><br /> ----------------------------------------<br /> <span style="display: none">L B d-f-A/o*c0</span>NULL<span style="display: none">ITPUB个hI间(C"}5Q5A#L#t</span><br /> NULL</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> SELECT MAX(ID) FROM T;</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">MAX(ID)<br /> <span style="display: none">!C Cs"Ys5|'`0</span>----------</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><br /> <span style="display: none">G_S.c d5mk)O#c0</span><font face="宋体">SQL> SELECT AVG(ID) FROM T;</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">AVG(ID)<span style="display: none">ITPUB个hI间*O.Ylk0OU(Oy4Dq$vQr</span><br /> ----------</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><br /> <span style="display: none">RFf+Lf{] y0</span><font face="宋体">SQL> INSERT INTO T VALUES (1);</font></span></p> <p><span style="font-size: 10.5pt"><font face="宋体">已创?span lang="EN-US"> 1 行?/span></font></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">聚集函数中比较特D的?span lang="EN-US">COUNTQ第一个特D点是COUNT不会q回NULL|即表中没有记录Q或者COUNT(COL)中,COL列的记录全ؓNULLQCOUNT也会q回0D不是NULL。第二个Ҏ点就是COUNT(*)或COUNT(帔R)的Ş式。这UŞ式得COUNT可以计算包含NULL记录在内的记录L?/span></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> SELECT COUNT(*), COUNT(1), COUNT('A'), COUNT(ID), COUNT(NULL) FROM T;</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">COUNT(*) COUNT(1) COUNT('A') COUNT(ID) COUNT(NULL)<span style="display: none">ITPUB个hI间-NNOH2z</span><br /> ---------- ---------- ---------- ---------- -----------<br /> <span style="display: none">;s t:O8t3o.y0t0</span> 3 3 3 1 0</font></span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">最后简单说一?span lang="EN-US">AVGQAVG(COL){h于SUM(COL)/COUNT(COL)Q不{h于SUM(COL)/COUNT(*)Q?/span></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">SQL> SELECT AVG(ID), SUM(ID)/COUNT(ID), SUM(ID)/COUNT(*) FROM T;</font></span></p> <p><span style="font-size: 10.5pt" lang="EN-US"><font face="宋体">AVG(ID) SUM(ID)/COUNT(ID) SUM(ID)/COUNT(*)<br /> <span style="display: none">6~{9O*mL9C7c)p0</span>---------- ----------------- ----------------<br /> <span style="display: none">6@:[S'L&k\&V9{VR0</span> 1 1 .333333333</font></span></p> <p style="text-indent: 21pt"></p> <p style="text-indent: 21pt"></p> <br /> <img src ="http://www.aygfsteel.com/lingy/aggbug/284559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-29 10:59 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/29/284559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>能否按照DECODE条g来COUNTQ?Q?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/29/284556.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Mon, 29 Jun 2009 02:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/29/284556.html</guid><description><![CDATA[<p>表A   <br />       DW               WP             BJ   <br />       Q-Q-Q-Q-Q-Q-Q-Q-   <br />       A                 M1             Y   <br />       B                 M2             N   <br />       C                 M3             Y   <br />       D                 M1             Y   <br />     <br />   我向l计BJ?Y‘的DW有多个和总DW多少个?Q?  <br />     我用COUNT(DW),COUNT(DECODE(A.BJ,'Y',DW,0))   <br />   q样不行啊?Q?  <br />   SQL应该怎么写啊Q?Q不要用兼套语句Q这样太|嗦?<span>问题ҎQ?0、回复次敎ͼ3</span><a >Top</a> </p> <div id="wmqeeuq" class="tagad"><iframe src="/Include/Board.htm?Tags=" frameborder="0" scrolling="no"></iframe></div> <h3><strong><a class="anchor" name="r_34342834">1 ?/a>Visual_Studio_NetQ打鼠英雄)<input class="user5" title="五用户 该版得分于{于5000分,大于2000? type="button" /></strong><span>回复?2006-04-22 20:08:49 得分 <em>15</em></span></h3> <p>SELECT   COUNT(DW),SUM(DECODE(BJ,'Y',1,0))   FROM   A<a >Top</a></p> <h3><strong><a class="anchor" name="r_34342852">2 ?/a>chliang315Q)<input class="user3" title="三用户 该版得分于{于1000分,大于500? type="button" /></strong><span>回复?2006-04-22 20:11:32 得分 <em>35</em></span></h3> <p>可以?  <br />   COUNT(DW),COUNT(DECODE(A.BJ,'Y',DW,null))<a >Top</a></p> <h3><strong><a class="anchor" name="r_34342979">3 ?/a>bbcboyQ烦猪哥哥)<input class="user1" title="一U用?该版得分于{于100? type="button" /></strong><span>回复?2006-04-22 20:30:58 得分 0 </span></h3> <p>两位都是好h啊!Q?  <br />   非常感谢Q!   <br />   </p> <img src ="http://www.aygfsteel.com/lingy/aggbug/284556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-29 10:57 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/29/284556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle trunc()函数的用?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/19/283162.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Fri, 19 Jun 2009 01:39:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/19/283162.html</guid><description><![CDATA[<span id="wmqeeuq" class="bold"><span id="wmqeeuq" class="smalltxt">TRUNC()函數分兩E?img src="http://blog.csdn.net/Emoticons/tongue_smile.gif" alt="" /><br /> <br /> </span></span>1.TRUNC(for dates)<br />         TRUNC函数为指定元素而截ȝ日期倹{?br />         其具体的语法格式如下Q?br />         TRUNCQdate[,fmt]Q?br />         其中Q?br />         date        一个日期?br />         fmt                日期格式Q该日期由指定的元素格式所截去。忽略它则由最q的日期截去<br />         下面是该函数的用情况:<br />         TRUNCQTO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’)Q?br />                 =’24-Nov-1999 12:00:00 am’<br />         TRUNCQTO_DATE(’24-Nov-1999 08:37 pm’,’dd-mon-yyyy hh:mi am’,’hh’)Q?nbsp;       =’24-Nov-1999 08:00:00 am’<br /> <br /> 2.TRUNC(for number)<br />         TRUNC函数q回处理后的数|其工作机制与ROUND函数极ؓcMQ只是该函数不对指定数前或后的部分做相应舍入选择处理Q而统l截厅R?br />         其具体的语法格式如下<br />         TRUNCQnumber[,decimals]Q?br />         其中Q?br />         number        待做截取处理的数?br />         decimals        指明需保留数点后面的位数。可选项Q忽略它则截L有的数部分<br />         下面是该函数的用情况:<br />         TRUNCQ?9.985Q?Q?89.98<br />         TRUNCQ?9.985Q?89<br />         TRUNCQ?9.985Q?1Q?80<br />         注意Q第二个参数可以敎ͼ表示为小数点左边指定位数后面的部分截去,卛_?记?<br /> <img src ="http://www.aygfsteel.com/lingy/aggbug/283162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-19 09:39 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/19/283162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle merge into 的用法详?实例 http://www.aygfsteel.com/lingy/archive/2009/06/18/283070.html林光?/dc:creator>林光?/author>Thu, 18 Jun 2009 08:10:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/18/283070.htmloracle merge into 的用法详?实例
oracle merge into 的用法详?实例

作用Qmerge into 解决用B表跟新A表数据,如果A表中没有Q则把B表的数据插入A表;

语法Q?/p>

MERGE INTO [your table-name] [rename your table here]

USING ( [write your query here] )[rename your query-sql and using just like a table]

ON ([conditional expression here] AND [...]...)

WHEN MATHED THEN [here you can execute some update sql or something else ]

WHEN NOT MATHED THEN [execute something else here ! ]

-------------------------------------实例-----------------------------------------------------------------

merge into tfa_alarm_act_nms a
using (select FP0,FP1,FP2,FP3,REDEFINE_SEVERITY
from tfa_alarm_status) b
on (a.fp0=b.fp0 and a.fp1=b.fp1 and a.fp2=b.fp2 and a.fp3=b.fp3)
when matched then update set a.redefine_severity=b.redefine_severity
when not matched then insert (a.fp0,a.fp1,a.fp2,a.fp3,a.org_severity,a.redefine_severity,a.event_time
,a.int_id)
values (b.fp0,b.fp1,b.fp2,b.fp3,b.REDEFINE_SEVERITY,b.redefine_severity,sysdate,7777778);

作用Q利用表 tfa_alarm_status跟新?font color="#0000ff">tfa_alarm_act_nms 的b.redefine_severityQ?/font>条g?font color="#0000ff">a.fp0=b.fp0 and a.fp1=b.fp1 and a.fp2=b.fp2 and a.fp3=b.fp3Q?/font>如果tfa_alarm_act_nms表中没有该条件的数据插入?/font>

如果你的数据量很大,此sql效率非常高?/p>



]]>
解析Q怎样使用Oracle的DECODE()函数 http://www.aygfsteel.com/lingy/archive/2009/06/18/283067.html林光?/dc:creator>林光?/author>Thu, 18 Jun 2009 08:08:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/18/283067.html 

DECODE()函数Q它输入数g函数中的参数列表相比较,Ҏ输入D回一个对应倹{函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当Ӟ如果未能与Q何一个实参序偶匹配成功,则函C有默认的q回倹{?

区别于SQL的其它函敎ͼDECODE函数q能识别和操作空倹{?

语法QDECODE(control_value,value1,result1[,value2,result2…][,default_result]);

control _value试图处理的数倹{DECODE函数该数g后面的一pd的偶序相比较Q以军_q回倹{?

value1是一l成序偶的数倹{如果输入数g之匹配成功,则相应的l果被q回。对应一个空的返回|可以使用关键字NULL于之对应

result1 是一l成序偶的结果倹{?

default_result 未能与Q何一个值匹配时Q函数返回的默认倹{?

例如Q?

selectdecode( x , 1 , ‘x is 1 ’, 2 , ‘x is 2 ’, ‘others’) from dual

当x{于1Ӟ则返?#8216;x is 1’?

当x{于2Ӟ则返?#8216;x is 2’?

否则Q返回others’?

需要,比较2个值的时候,可以配合SIGN()函数一起用?

SELECT DECODE( SIGN(5 -6), 1 'Is Positive', -1, 'Is Nagative', 'Is Zero')

同样Q也可以用CASE实现Q?

SELECT CASE SIGN(5 - 6)
            WHEN  1  THEN  'Is Positive'
            WHEN -1 THEN  'Is Nagative'
            ELSE 'Is Zero' END
            FROM DUAL

此外Q还可以在Order by中用Decode?

例如Q表table_subjectQ有subject_name列。要求按照:语、数、外的顺序进行排序。这Ӟ可以非常轻杄使用Decode完成要求了?

select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)Q责ȝ辑:卢兆林)



]]>
怎样从一个过E返回一个结果集http://www.aygfsteel.com/lingy/archive/2009/06/18/283045.html林光?/dc:creator>林光?/author>Thu, 18 Jun 2009 06:22:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/18/283045.htmlcreate or replace procedure p_stu_lst(result out sys_refcursor) is
BEGIN
   OPEN RESULT FOR SELECT * FROM test;
end p_stu_lst;
SQL> select * from test;

NAME       KM                 CJ
---------- ---------- ----------
张三       语文               80
张三       数学               86
张三       p               75
李四       语文               78
李四       数学               85
李四       p               78
李四       物理               90

已选择7行?br />
SQL> exec p_stu_lst(:aaa);

PL/SQL q程已成功完成?br />
SQL> print aaa

NAME       KM                 CJ
---------- ---------- ----------
张三       语文               80
张三       数学               86
张三       p               75
李四       语文               78
李四       数学               85
李四       p               78
李四       物理               90

已选择7行?/div>

]]>
Oracle PL/SQL游标的学?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/18/283042.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Thu, 18 Jun 2009 06:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/18/283042.html</guid><description><![CDATA[<div id="wmqeeuq" class="adgg"><a target="_blank">被过滤广?/a></div> <strong>一 游标是什?/strong> <br /> <br /> 游标字面理解是游动的光标?<br /> <br /> 用数据库语言来描qͼ游标是映在l果集中一行数据上的位|实体,有了游标Q用户就可以讉Kl果集中的Q意一行数据了Q将游标攄到某行后Q即可对该行数据q行操作Q例如提取当前行的数据等?<br /> <br /> <strong>?游标的分c?/strong> <br /> <br /> 昑ּ游标和隐式游?<br /> <br /> 昑ּ游标的用需?步: <br /> <br /> 1. 声明游标 <br /> <br /> <ccid_nobr> <table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="400" align="center"> <tbody> <tr> <td style="font-size: 9pt" class="code" bgcolor="#e6e6e6"> <pre><ccid_code>CURSOR mycur(vartype number) is select emp_no,emp_zc from cus_emp_basic where com_no = vartype;</ccid_code></pre> </td> </tr> </tbody> </table> </ccid_nobr><br /> <br /> 2. 打开游标 <br /> <br /> open mycur(000627) <br /> <br /> 注:000627是参?<br /> <br /> 3. d数据 <br /> <br /> fetch mycur into varno, varprice; <br /> <br /> 4. 关闭游标 <br /> <br /> close mycur; <br /> <br /> <strong>?游标的属?/strong> <br /> <br /> oracle 游标?个属性:%ISOPENQ?FOUNDQ?NOTFOUNDQ?ROWCOUNT?<br /> <br /> %ISOPEN判断游标是否被打开Q如果打开%ISOPEN{于true,否则{于falseQ?<br /> <br /> %FOUND %NOTFOUND判断游标所在的行是否有效,如果有效Q则%FOUNDD{于trueQ否则等于falseQ?<br /> <br /> %ROWCOUNTq回当前位置为止游标d的记录行数?<br /> <br /> <strong>?CZ</strong> <br /> <br /> <ccid_nobr> <table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="400" align="center"> <tbody> <tr> <td style="font-size: 9pt" class="code" bgcolor="#e6e6e6"> <pre><ccid_code>set serveroutput on; declare varno varchar2(20); varprice varchar2(20); CURSOR mycur(vartype number) is select emp_no,emp_zc from cus_emp_basic where com_no = vartype; begin if mycur%isopen = false then open mycur(000627); end if; fetch mycur into varno,varprice; while mycur%found loop dbms_output.put_line(varno||','||varprice); if mycur%rowcount=2 then exit; end if; fetch mycur into varno,varprice; end loop; close mycur; end;</ccid_code></pre> </td> </tr> </tbody> </table> </ccid_nobr><br /> <br /> PL/SQL记录的结构和C语言中的l构体类|是由一l数据项构成的逻辑单元?<br /> <br /> PL/SQL记录q不保存在数据库中,它与变量一P保存在内存空间中Q在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用戯定义的数据类型?<br /> <br /> <ccid_nobr> <table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="400" align="center"> <tbody> <tr> <td style="font-size: 9pt" class="code" bgcolor="#e6e6e6"> <pre><ccid_code>set serveroutput on; declare type person is record ( empno cus_emp_basic.emp_no%type, empzc cus_emp_basic.emp_zc%type); person1 person; cursor mycur(vartype number)is select emp_no,emp_zc from cus_emp_basic where com_no=vartype; begin if mycur%isopen = false then open mycur(000627); end if; loop fetch mycur into person1; exit when mycur%notfound; dbms_output.put_line('雇员~号:'||person1.empno||',地址:'||person1.empzc); end loop; close mycur; end;</ccid_code></pre> </td> </tr> </tbody> </table> </ccid_nobr><br /> <br /> 典型游标for 循环 <br /> <br /> 游标for循环C显C游标的一U快捷用方式,它用for循环依次dl果集中的行数据Q当form循环开始时Q游标自动打开Q不需要openQ,每@环一ơ系l自动读取游标当前行的数据(不需要fetch)Q当退出for循环Ӟ游标被自动关闭(不需要用closeQ。用游标for循环的时候不能用open语句Qfetch语句和close语句Q否则会产生错误?<br /> <br /> <ccid_nobr> <table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="400" align="center"> <tbody> <tr> <td style="font-size: 9pt" class="code" bgcolor="#e6e6e6"> <pre><ccid_code>set serveroutput on; declare cursor mycur(vartype number)is select emp_no,emp_zc from cus_emp_basic where com_no=vartype; begin for person in mycur(000627) loop dbms_output.put_line('雇员~号:'||person.emp_no||',地址:'||person.emp_zc); end loop; end;</ccid_code></pre> </td> </tr> </tbody> </table> </ccid_nobr><br /> <img src ="http://www.aygfsteel.com/lingy/aggbug/283042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-18 14:11 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/18/283042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle PL/SQL语言入门http://www.aygfsteel.com/lingy/archive/2009/06/18/283023.html林光?/dc:creator>林光?/author>Thu, 18 Jun 2009 04:37:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/18/283023.html一、背景介l?/strong>

  l构化查询语a(Structured Query LanguageQ简USQL)是用来访问关pd数据库一U通用语言Q属于第四代语言Q?GLQ,其执行特Ҏ非过E化Q即不用指明执行的具体方法和途径Q而是单地调用相应语句来直接取得结果即可。显Ӟq种不关注Q何实现细节的语言对于开发者来说有着极大的便利。然而,有些复杂的业务流E要求相应的E序来描qͼq种情况?GL有些无能ؓ力了。PL/SQL的出现正是ؓ了解册一问题QPL/SQL是一U过E化语言Q属于第三代语言Q它与C、C++、Java{语a一样关注于处理l节Q可以用来实现比较复杂的业务逻辑。本文主要介lPL/SQL的编E基Q以使入门者对PL/SQL语言有一个M认识和基本把握?

二、编E基知识

  1. E序l构

  PL/SQLE序都是以块QblockQؓ基本单位Q整个PL/SQL块分三部分:声明部分Q用declare开_、执行部分(以begin开_和异常处理部分(以exception开_。其中执行部分是必须的,其他两个部分可选。无论PL/SQLE序D늚代码量有多大Q其基本l构是p三部分组成。如下所CZؓ一D完整的PL/SQL块:

/*声明部分Q以declare开?/
            declare v_id integer;
            v_name varchar(20);
            cursor c_emp is select * from employee where emp_id=3;
            /*执行部分Q以begin开?/
            begin  open c_emp;             //打开游标 
              loop  
                fetch c_emp into v_id,v_name;      //从游标取数据  
                exit when c_emp%notfound ; 
              end loop ;
            close c_emp;                       //关闭游标
            dbms_output.PUT_LINE(v_name);
            /*异常处理部分Q以exception开?/
            exception
              when no_data_found then
              dbms_output.PUT_LINE('没有数据');
            end ;

  2. 控制l构

  PL/SQLE序D中有三U程序结构:条gl构、@环结构和序l构?

  1) 条gl构

  与其它语a完全cMQ语法结构如下:

if condition then
            statement1
            else
            statement2
            end if ;
  

  2) 循环l构

  q一l构与其他语a不太一P在PL/SQLE序中有三种循环l构Q?

a. loop … end loop;
            b. while condition loop … end loop;
            c. for variable in low_bound . . upper_bound loop … end loop;

  其中?#8220;…”代表循环体?

  3) 序l构

  实际是goto的运用,不过从程序控制的角度来看Q尽量少用goto可以使得E序l构更加的清晰?

  3. 变量声明与赋?

  PL/SQL主要用于数据库编E,所以其所有的数据cd跟Oracle数据库里的字D늱型是一一对应的,大体分ؓ数字型、布型、字W型和日期型。这里简单介l两U常用数据类型:number、varchar2?

  number

  用来存储整数和QҎ。范围ؓQe130?0e125Q其使用语法为:

  number[(precision, scale)]

  其中(precision, scale)是可选的Qprecision表示所有数字的个数Qscale表示数点右Ҏ字的个数?

  varchar2

  用来存储变长的字W串Q其使用语法为:

  varchar2[(size)]

  其中size为可选,表示该字W串所能存储的最大长度?

  在PL/SQL中声明变量与其他语言不太一P它采用从叛_左的方式声明Q比如声明一个numbercd的变量v_idQ那其Ş式应为:

  v_id number;

  如果l上面的v_id变量赋|不能?#8220;=”Q应该用“:=”,卛_Ş式ؓQ?

  v_id :=5;

  4. SQL基本命o

  PL/SQL使用的数据库操作语言q是ZSQL的,所以熟悉SQL是进行PL/SQL~程的基。SQL语言的分cL况大致如下:

  1) 数据定义语言(DDL)QCreateQDropQGrantQRevokeQ?#8230;

  2) 数据操纵语言(DML)QUpdateQInsertQDeleteQ?#8230;

  3) 数据控制语言(DCL)QCommitQRollbackQSavapointQ?#8230;

  4) 其他QAlter SystemQConnectQAllocateQ?…

  具体的语法结构可以参阅其他关于SQL语言的资料,q里不再赘述?

  三、过E与函数

  PL/SQL中的q程和函C其他语言的过E和函数一P都是Z执行一定的d而组合在一L语句。过E无q回|函数有返回倹{其语法l构为:

  q程QCreate or replace procedure procname(参数列表) as PL/SQL语句?

  函数QCreate or replace function funcname(参数列表) return q回?as PL/SQL语句?

  Z于理解,举例如下Q?

  问题Q假设有一张表t1Q有f1和f2两个字段Qf1为numbercdQf2为varchar2cdQ要往t1里写两条记录Q内容自定?

Create or replace procedure test_procedure as
            V_f11 number :=1; /*声明变量q赋初?/
            V_f12 number :=2;
            V_f21 varchar2(20) :='first';
            V_f22 varchar2(20) :='second';
            Begin
            Insert into t1 values (V_f11, V_f21);
            Insert into t1 values (V_f12, V_f22);
            End test_procedure; /*test_procedure可以省略*/

  xQtest_procedure存储q程已经完成Q经q编译后可以在其他PL/SQL块或者过E中调用了。函Cq程h很大的相似性,此处不再详述?

  四、游?/strong>

  游标的定义ؓQ用游标来指代一个DML SQL操作q回的结果集。即当一个对数据库的查询操作q回一l结果集Ӟ用游标来标注q组l果集,以后通过Ҏ标的操作来获取结果集中的数据信息。这里特别提出游标的概念Q是因ؓ它在PL/SQL的编E中非常的重要。定义游标的语法l构如下Q?

  cursor cursor_name is SQL语句;

  在本文第一D代码中有一句话如下Q?

  cursor c_emp is select * from employee where emp_id=3;

  其含义是定义一个游标c_empQ代表employee表中所有emp_id字段为3的结果集。当需要操作该l果集时Q必d成三步:打开游标、用fetch语句游标里的数据取出、关闭游标。请参照本文W一D代码的注释理解游标操作的三步骤?

  五、其他概?/strong>

  PL/SQL中包的概念很重要Q主要是对一l功能相q的q程和函数进行封装,cM于面向对象中的名字空间的概念?

  触发器是一U特D的存储q程Q其调用者比较特D,是当发生特定的事件才被调用,主要用于多表之间的消息通知?

  xQ就介绍了PL/SQL的编E基知识Q至于实际的应用Q以后接着探讨?



]]>
PL/SQL教程(?http://www.aygfsteel.com/lingy/archive/2009/06/18/283012.html林光?/dc:creator>林光?/author>Thu, 18 Jun 2009 03:51:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/18/283012.html阅读全文

]]>
oracle 存储q程的基本语?/title><link>http://www.aygfsteel.com/lingy/archive/2009/06/18/282994.html</link><dc:creator>林光?/dc:creator><author>林光?/author><pubDate>Thu, 18 Jun 2009 02:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/lingy/archive/2009/06/18/282994.html</guid><description><![CDATA[<div id="wmqeeuq" class="postbody"> <h1>oracle 存储q程的基本语?/h1> <p><strong><br /> 1.基本l构</strong> <br /> CREATE OR REPLACE PROCEDURE 存储q程名字<br /> (<br />     参数1 IN NUMBER,<br />     参数2 IN NUMBER<br /> ) IS<br /> 变量1 INTEGER :=0;<br /> 变量2 DATE;<br /> BEGIN</p> <p>END 存储q程名字<br /> <br /> <strong>2.SELECT INTO STATEMENT</strong><br />   select查询的结果存入到变量中,可以同时多个列存储多个变量中,必须有一?br />   记录Q否则抛出异?如果没有记录抛出NO_DATA_FOUND)<br />   例子Q?<br />   BEGIN<br />   SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;<br />   EXCEPTION<br />   WHEN NO_DATA_FOUND THEN<br />       xxxx;<br />   END;<br />   ...<br /> <br /> <strong>3.IF 判断</strong><br />   IF V_TEST=1 THEN<br />     BEGIN <br />        do something<br />     END;<br />   END IF;<br /> <br /> <strong>4.while 循环</strong><br />   WHILE V_TEST=1 LOOP<br />   BEGIN<br />  XXXX<br />   END;<br />   END LOOP;<br /> <strong><br /> 5.变量赋?br /> </strong>  V_TEST := 123;<br /> <strong><br /> 6.用for in 使用cursor</strong><br />   ...<br />   IS<br />   CURSOR cur IS SELECT * FROM xxx;<br />   BEGIN<br />  FOR cur_result in cur LOOP<br />   BEGIN<br />    V_SUM :=cur_result.列名1+cur_result.列名2<br />   END;<br />  END LOOP;<br />   END;<br /> <br /> <strong>7.带参数的cursor</strong><br />   CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;<br />   OPEN C_USER(变量?;<br />   LOOP<br />  FETCH C_USER INTO V_NAME;<br />  EXIT FETCH C_USER%NOTFOUND;<br />     do something<br />   END LOOP;<br />   CLOSE C_USER;<br /> <br /> <strong>8.用pl/sql developer debug<br /> </strong>  q接数据库后建立一个Test WINDOW<br />   在窗口输入调用SP的代?F9开始debug,CTRL+N单步调试</p> </div> <img src ="http://www.aygfsteel.com/lingy/aggbug/282994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lingy/" target="_blank">林光?/a> 2009-06-18 10:43 <a href="http://www.aygfsteel.com/lingy/archive/2009/06/18/282994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle l定变量(bind variable)http://www.aygfsteel.com/lingy/archive/2009/06/15/282426.html林光?/dc:creator>林光?/author>Mon, 15 Jun 2009 11:20:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/06/15/282426.html
oracle 中,对于一个提交的sql语句,存在两种可选的解析q程, 一U叫做硬解析,一U叫做Y解析.
一个硬解析需要经解析,制定执行路径,优化讉K计划{许多的步骤.解释不仅仅耗费大量的cpuQ更重要的是会占据重要的们闩QlatchQ资源,严重的媄响系l的规模的扩大(即限制了pȝ的ƈ发行Q, 而且引v的问题不能通过增加内存条和cpu的数量来解决?
之所以这h因ؓ门闩是ؓ了顺序访问以及修改一些内存区域而设|的Q这些内存区域是不能被同时修攏V当一个sql语句提交后,oracle会首先检查一下共享缓冲池Qshared poolQ里有没有与之完全相同的语句Q如果有的话只须执行软分析即可,否则得q行分析?br /> 而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质是用于替代sql语句中的帔R的替代变量。绑定变量能够得每ơ提交的sql语句都完全一栗?br /> 普通sql语句Q?br />

SELECT fname, lname, pcode FROM cust WHERE id = 674;
SELECT fname, lname, pcode FROM cust WHERE id = 234;
SELECT fname, lname, pcode FROM cust WHERE id = 332;
含绑定变量的sql 语句Q?br /> SELECT fname, lname, pcode FROM cust WHERE id = :cust_no;

Sql*plus 中用绑定变量:
sql> variable x number;
sql> exec :x := 123;
sql> SELECT fname, lname, pcode FROM cust WHERE id =:x;

 

pl/sql
pl/sql很多时候都会自动绑定变量而无需~程人员操心Q即很多你写得sql语句都会自动利用l定变量Q如下例所C:


create or replace procedure dsal(p_empno in number)
as
begin
update emp
set sal=sal*2
where empno = p_empno;
commit;
end;
/

也许此时你会惌利用l定变量来替代p_empno,但是q是完全没有必要的,因ؓ在pl/sql中,引用变量x引用l定变量?br /> 但是在pl/sql中动态sqlq不是这栗?br /> 在vbQjava以及其他应用E序中都得显式地利用l定变量?br /> 对于l定变量的支持不仅仅限于oracle,其他RDBMS向SQLQIIQԌQR也支持这一Ҏ?br /> 但是q不是Q何情况下都需要用绑定变量, 下面是两U例外情况:
1Q对于隔相当一D|间才执行一ơ的sql语句,q是利用l定变量的好处会被不能有效利用优化器而抵?br /> 2Q数据仓库的情况下?/div>

]]>如何得到一个存储过E的创徏脚本http://www.aygfsteel.com/lingy/archive/2009/05/27/278279.html林光?/dc:creator>林光?/author>Wed, 27 May 2009 15:21:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/05/27/278279.html1Q如何得C个存储过E的创徏脚本
查询数据字典Quser_source ?dba_source
SQL>select text from dba_source where name='p_******' and type='PROCEDURE';

2Q如何得到数据库中无效的存储q程
查询数据字典Qdba_objects
SQL> select object_name from dba_objects where object



]]>
Oracle function ?http://www.aygfsteel.com/lingy/archive/2009/05/26/277972.html林光?/dc:creator>林光?/author>Tue, 26 May 2009 03:11:00 GMThttp://www.aygfsteel.com/lingy/archive/2009/05/26/277972.html阅读全文

]]>
վ֩ģ壺 | μ| ͨ| | Ҫ| Ϫ| | | | | ˮ| غ| ӱ| ͻȪ| ױ| ˾| лͨ| | | | ݰ| | | ˮ| | | üɽ| | | | | | | ̨| | ֱ| Դ| | | | |