首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

在PLSQL中可以执行的语句在DELPHI中不能执行?解决思路

2012-02-05 
在PLSQL中可以执行的语句在DELPHI中不能执行?--CreatetablecreateglobaltemporarytableTTMPSALPACKPLU_TMP

在PLSQL中可以执行的语句在DELPHI中不能执行?
--   Create   table
create   global   temporary   table   TTMPSALPACKPLU_TMPlsl
(
    ORGCODE       VARCHAR2(10),
    SALENO         VARCHAR2(20),
    XSDATE         DATE,
    PAGENO         NUMBER(10),
    LNNO             NUMBER(10),
    PLUID           NUMBER(19),
    PLUCODE       VARCHAR2(20),
    PLUNAME       VARCHAR2(40),
    EXPLUCODE   VARCHAR2(20),
    BARCODE       VARCHAR2(20),
    UNIT             VARCHAR2(6),
    SPEC             VARCHAR2(40),
    PRICE           NUMBER(19,4),
    FSPRICE       NUMBER(19,4),
    XSCOUNT       NUMBER(19,4),
    YSTOTAL       NUMBER(19,2),
    SSTOTAL       NUMBER(19,2),
    YHTOTAL       NUMBER(19,2),
    XFTYPE         VARCHAR2(1),
    VIPCARDNO   VARCHAR2(40),
    CXBILLNO     VARCHAR2(20),
    HYBILLNO     VARCHAR2(20)
)
On   Commit   Delete   Rows;

--   Create   table
create   global   temporary   table   TTMPSALPACKMXPLU_TMPlsl
(
    ORGCODE       VARCHAR2(10),
    SALENO         VARCHAR2(20),
    XSDATE         DATE,
    PAGENO         NUMBER(10),
    LNNO             NUMBER(10),
    PACKCODE     VARCHAR2(20),
    PLUID           NUMBER(19),
    PLUCODE       VARCHAR2(20),
    PLUNAME       VARCHAR2(40),
    EXPLUCODE   VARCHAR2(20),
    BARCODE       VARCHAR2(20),
    UNIT             VARCHAR2(6),
    SPEC             VARCHAR2(40),
    DEPID           NUMBER(19),
    DEPCODE       VARCHAR2(10),
    DEPNAME       VARCHAR2(100),
    PRICE           NUMBER(19,4),
    FSPRICE       NUMBER(19,4),
    XSCOUNT       NUMBER(19,4),
    SSTOTAL       NUMBER(19,2),
    XFTYPE         VARCHAR2(1),
    VIPCARDNO   VARCHAR2(40),
    CXBILLNO     VARCHAR2(20),
    HYBILLNO     VARCHAR2(20)
)
on   commit   Delete   rows;
-----整理商品包
  Insert   into   TTMPSALPACKPLU_TMPlsl   nologging   (OrgCode,SaleNo,XsDate,PageNo,LnNo,PluID,PluCode,PluName,ExPluCode,
                  BarCode,Unit,Spec,
                  Price,FsPrice,XsCount,YsTotal,SsTotal,YhTotal,XfType,
                  VipCardNo,CxBillNo,HyBillNo)


    Select   A.OrgCode,A.SaleNo,A.XsDate,A.PageNo,A.LnNo,A.PluID,A.PluCode,A.PluName,A.ExPluCode,
                  A.BarCode,A.Unit,A.Spec,
                  A.Price,A.FsPrice,A.XsCount,A.YsTotal,A.SsTotal,A.YhTotal,A.XfType,
                  B.VipCardNo,A.CxBillNo,A.HyBillNo
        From   tSalSalePlu   A,tSalSale   B
      Where   A.TranType= '1 '   and   A.PackType= '2 '  
          and   B.OrgCode=A.OrgCode   and   B.SaleNo=A.SaleNo;


  --对商品包数据进行拆包
Insert     into   tTmpSalPackMxPlu_Tmplsl   nologging   (OrgCode,SaleNo,XsDate,PageNo,LnNo,
                  PackCode,PluID,PluCode,PluName,ExPluCode,BarCode,Unit,Spec,
                  DepID,DepCode,DepName,Price,FsPrice,XsCount,SsTotal,
                  XfType,VipCardNo,CxBillNo,HyBillNo)
    Select   A.OrgCode,A.SaleNo,A.XsDate,A.PageNo,A.LnNo,
                  A.PluID   as   PackCode,B.PluID,B.PluCode,B.PluName,B.ExPluCode,B.BarCode,B.Unit,B.Spec,
                  0   as   DepID,null   as   DepCode,null   as   DepName,B.Price,B.Price   as   FsPrice,--下面更新部门和售价
                  A.XsCount*B.PackageCount   as   XsCount,Round(A.SsTotal*B.PriceRate/100.0,2)   as   SsTotal,
                  A.XfType,A.VipCardNo,A.CxBillNo,A.HyBillNo
        From   tTmpSalPackPlu_Tmplsl   A,tSkuPluPackageBody   B
      Where   B.PackageID=A.PluID;

--更新拆包后明细商品的部门和售价
      Update   tTmpSalPackMxPlu_Tmplsl   A  
          Set   (DepID,DepCode,DepName,Price,FsPrice)
                =(Select   B.DepID,(Select   DepCode   From   tOrgDept   Where   DepID=B.DepID)   as   DepCode,
                                  (Select   DepName   From   tOrgDept   Where   DepID=B.DepID)   as   DepName,
                                  B.Price,B.Price
                      From     tSkuPluEx   B
                      where   B.OrgCode=A.OrgCode   and   B.PluID=A.PluID)
            Where   Exists(Select   1   From   tSkuPluEx   B
                                          where   B.OrgCode=A.OrgCode   and   B.PluID=A.PluID);
                                         
               
 


 
select   Rpt.OrgCode,   Org.OrgName,   SUBSTR(Rpt.DepCode,   1,   2)   as   DepCode,   Dep.DepName   as   DepName,
                      sum(Rpt.XsCount)   as   XsCount,  
                      sum(Rpt.YsTotal)   as   YsTotal,    
                      sum(Rpt.SsTotal)   as   SsTotal,            
                      sum(Rpt.YhTotal)   as   YhTotal        
        from   (   Select   ORGCODE   ,SALENO,XSDATE,PAGENO,LNNO,PACKCODE,
                        PLUID,PLUCODE,PLUNAME,EXPLUCODE,BARCODE,UNIT,
                        SPEC,DEPID,DEPCODE,DEPNAME,PRICE,FSPRICE,XSCOUNT,
                        SSTOTAL,XFTYPE,FsPrice*XsCount-SsTotal   As   YhTotal,FsPrice*XsCount   As   YsTotal
                      from   TTMPSALPACKMXPLU_TMPlsl
                    Union   All
                    Select     ORGCODE   ,SALENO,XSDATE,PAGENO,LNNO,PACKCODE,
                          PLUID,PLUCODE,PLUNAME,EXPLUCODE,BARCODE,UNIT,
                          SPEC,DEPID,DEPCODE,DEPNAME,PRICE,FSPRICE,XSCOUNT,
                          SSTOTAL,XFTYPE   ,YhTotal,YsTotal
                        from   tSalSalePlu
                        Where     Packtype <> '2 '
                            )   Rpt,
                    tOrgManage   Org,   tOrgDept   Dep
        where       Rpt.OrgCode=Org.OrgCode
              and   Rpt.OrgCode=Dep.OrgCode
              And   Org.OrgCode=Dep.OrgCode
 
              and   SUBSTR(Rpt.DepCode,   1,   2)=Dep.DepCode   and   dep.isactive=1
            And   Exists   (Select   *   From   tSalSale   S   Where   S.OrgCode=Rpt.OrgCode   And   S.saleNo=Rpt.saleNo   And   S.JzDate   Is   Null)---只查询未结账流水
          Group   by   Rpt.OrgCode,   Org.OrgName,   SUBSTR(Rpt.DepCode,   1,2),   Dep.DepName;


drop   table   TTMPSALPACKPLU_TMPlsl;
drop   table   TTMPSALPACKMXPLU_TMPlsl;

Commit   ;


如题,在PLSQL中可以执行,但放到ADOQuery中就不能执行了

------解决方案--------------------


pl/sql里能执行并不表示它就是标准的sql语句块,有些语句可能是经过pl/sql处理的.
[解决办法]
在存储过程中不能直接使用create table语句 你需要将create table 语句组织成sqlstr,类似于这样
--用户必须有create any table 权限
create or replace package pkg_test
is
type ResultData is ref cursor;
procedure test;
end pkg_test;
/
create or replace package body pkg_test
is
procedure test
is
cur ResultData;
fid varchar2(30);
fnumber int;
sqlstr varchar2(8000);
begin
sqlstr:= 'create global temporary table tmp( cid VARCHAR2(30),cnumber int )On Commit PRESERVE Rows ';
Execute Immediate sqlstr;
Execute Immediate 'insert into tmp values( ' '1 ' ',1) ';
Execute Immediate 'insert into tmp values( ' '2 ' ',2) ';
sqlstr:= 'select * from tmp ';
open cur for sqlstr;
loop
fetch cur into fid,fnumber;
exit when cur%notfound;
dbms_output.put_line( fid|| '- '||fnumber );
end loop;
close cur;
end;
end pkg_test;
--测试
declare
i int;
begin
pkg_test.test;
end;
--输出结果
1-1
2-2

热点排行