--给个存储过程中使用临时表的例子,看一下:create table SSS ( ID NUMBER, VALUE1 NUMBER )insert into sss values(1,2);CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS BEGIN execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA'; END BBBB;
你好,看了你给的存储过程,我正是想把某些查询结果存到临时表里(想建立三个这样的临时表),但是可以不显示出来,然后再用SQL语句把这些表联合查询成一张表, 现在关键是临时表不熟悉,有几个问题想问: 1,临时表跟SQL2000一样吗?是不是会话结束就自动在数据库里消失? 2,这几个临时表是作为最后查询用的,也就是说最后一步是再用SQL语句在这几张临时表里查询出结果并显示出来的,临时表的作用只是插入数据,你存储过程的 语句"OPEN PO_RESULT FOR 'select * from AAA';" 是否可以不用要? 3,在Delphi里如何调用这个存储过程,解决这几个问题马上结贴,谢谢
1.ON COMMIT DELETE ROWS 已经声明了临时表存在的scope 2.可以不要呀,存储过程中参数声明为out[CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR)] 代表作为返回参数用,他主要是为了保存结果,以便以后调用。如果是in的话就只可以传参用了。 3.delphi中调用存储过程,我不晓得你是用什么连接的.如果采用ADO方式。直接可以用ADOStoredProc控件。procedure TForm1.Button1Click(Sender: TObject); begin ADOStoredProc1.Close; DataSource1.DataSet:=ADOStoredProc1; ADOStoredProc1.ProcedureName:='BBBB; ADOStoredProc1.Parameters.Refresh; ADOStoredProc1.Parameters[1].Value:=XXX;--随便赋值,因为改参数他的过程中没用 ADOStoredProc1.Open; end;
我的SQL语句带有参数,比如时间参数,需要在Delphi在运行时在输入参数,这时怎么改过程以及调用?CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS BEGIN execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA'; END BBBB; 以BlueskyWide 提供的过程为例,具体如下: 假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2'; 这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE, 这时如何修改过程及调用,哪个请教以下 ------------>此题再加50分,解决了马上结贴
我的SQL语句带有参数,比如时间参数,需要在Delphi在运行时在输入参数,这时怎么改过程以及调用?CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS BEGIN execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA'; END BBBB; 以BlueskyWide 提供的过程为例,具体如下: 假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2'; 这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE, 这时如何修改过程及调用,哪个请教以下 ------------>此题再加50分,解决了马上结贴
关键是你要临时表用来干啥呢? oracle里面可不是很建议用临时表的select * into #b from a where nm='obj' 如果你要对临时表处理,oracle用with with x as ( select * from a where nm='obj' ) select * from b, x /* x 就相当于临时表了*/ ....
create table b as select * from a 这样就行呀,为什么非用临时表呢?
稍改一下:你说的这种情形可能要用到包及包体。 SQL> select * from sss;VALUE1 ID ---------- ---------- 1 1 2 2 3 3SQL> SQL> CREATE OR REPLACE package pkg_test is 2 --定义ref cursor类型 3 type myrctype is ref cursor; 4 5 --函数申明 6 function get(t1 number,t2 number) return myrctype; 7 end pkg_test; 8 /Package createdSQL> SQL> CREATE OR REPLACE package body pkg_test as 2 --函数体 3 function get(t1 number,t2 number) return myrctype is 4 rc myrctype; --定义ref cursor变量 5 sqlstr varchar2(500); 6 begin 7 sqlstr :='select * from sss where id>=:t1 and id<=:t2'; 8 open rc for sqlstr using t1,t2; 9 return rc; 10 end get; 11 12 end pkg_test; 13 /Package body createdSQL> --asp程序中使用:cm1.CommandText = "{call pkg_test.get(?)}"来调用,因本人对delphi不太熟悉,你可以搜一下或去delphi版问一下。
然后再向临时表insert
和SQL server不一样,
SQL server 还可以
declare @t table(idx int);
呢。
Oracle 临时表万不得已,
我一般不用它
而oracle的temporary table则是在数据库中存在的表,创建时可能指定不同属性.
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表 例:1、SESSION级临时表 --建立临时表create global temporary table temp_tbl(col_a varchar2(30))
on commit preserve rows --插入数据 insert into temp_tbl values('test session table') --提交 commit --查询数据 select *from temp_tbl 可以看到数据'test session table'记录还在 --结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录 2、TRANSACTION级临时表 --建立临时表create global temporary table temp_tbl(col_a varchar2(30))
on commit delete rows --插入数据 insert into temp_tbl values('test transaction table') --提交
commit
--查询数据 select *from temp_tbl 这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。
我是要两个表的数据合成一个表呀?不得不用临时表?又不是很熟悉ORACLE,是否还有好的办法可以实现?请高手指点.谢谢
create view as select ...;
(
ID NUMBER,
VALUE1 NUMBER
)insert into sss values(1,2);CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS
BEGIN
execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA';
END BBBB;
现在关键是临时表不熟悉,有几个问题想问:
1,临时表跟SQL2000一样吗?是不是会话结束就自动在数据库里消失?
2,这几个临时表是作为最后查询用的,也就是说最后一步是再用SQL语句在这几张临时表里查询出结果并显示出来的,临时表的作用只是插入数据,你存储过程的
语句"OPEN PO_RESULT FOR 'select * from AAA';" 是否可以不用要?
3,在Delphi里如何调用这个存储过程,解决这几个问题马上结贴,谢谢
2.可以不要呀,存储过程中参数声明为out[CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR)]
代表作为返回参数用,他主要是为了保存结果,以便以后调用。如果是in的话就只可以传参用了。
3.delphi中调用存储过程,我不晓得你是用什么连接的.如果采用ADO方式。直接可以用ADOStoredProc控件。procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.Close;
DataSource1.DataSet:=ADOStoredProc1;
ADOStoredProc1.ProcedureName:='BBBB;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters[1].Value:=XXX;--随便赋值,因为改参数他的过程中没用
ADOStoredProc1.Open;
end;
BEGIN
execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA';
END BBBB;
以BlueskyWide 提供的过程为例,具体如下:
假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2';
这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE, 这时如何修改过程及调用,哪个请教以下 ------------>此题再加50分,解决了马上结贴
BEGIN
execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON COMMIT DELETE ROWS '; execute immediate 'insert into AAA SELECT * FROM sss'; OPEN PO_RESULT FOR 'select * from AAA';
END BBBB;
以BlueskyWide 提供的过程为例,具体如下:
假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2';
这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE, 这时如何修改过程及调用,哪个请教以下 ------------>此题再加50分,解决了马上结贴
into #b
from a
where nm='obj' 如果你要对临时表处理,oracle用with
with x as (
select * from a where nm='obj'
)
select *
from b, x /* x 就相当于临时表了*/
....
这样就行呀,为什么非用临时表呢?
SQL> select * from sss;VALUE1 ID
---------- ----------
1 1
2 2
3 3SQL>
SQL> CREATE OR REPLACE package pkg_test is
2 --定义ref cursor类型
3 type myrctype is ref cursor;
4
5 --函数申明
6 function get(t1 number,t2 number) return myrctype;
7 end pkg_test;
8 /Package createdSQL>
SQL> CREATE OR REPLACE package body pkg_test as
2 --函数体
3 function get(t1 number,t2 number) return myrctype is
4 rc myrctype; --定义ref cursor变量
5 sqlstr varchar2(500);
6 begin
7 sqlstr :='select * from sss where id>=:t1 and id<=:t2';
8 open rc for sqlstr using t1,t2;
9 return rc;
10 end get;
11
12 end pkg_test;
13 /Package body createdSQL> --asp程序中使用:cm1.CommandText = "{call pkg_test.get(?)}"来调用,因本人对delphi不太熟悉,你可以搜一下或去delphi版问一下。