Plsql 通过在SQLPLUS中执行存储过程将数据插入全局临时表

Plsql 通过在SQLPLUS中执行存储过程将数据插入全局临时表,plsql,oracle-sqldeveloper,sqlplus,Plsql,Oracle Sqldeveloper,Sqlplus,我创建了一个存储过程。以及其中的全局临时表。 现在我通过将游标插入局部变量,将数据插入到这个表中 create or replace PROCEDURE "DEMO" ( PARM_YEAR IN NUMBER, PARM_PERIOD IN NUMBER, PARM_PERIOD_TYPE IN CHAR, PARM_PERIOD_ROLL IN CHAR, PARM_TYPE IN VARCHAR2, P_CURSOR IN OUT types.cursorType )

我创建了一个存储过程。以及其中的全局临时表。 现在我通过将游标插入局部变量,将数据插入到这个表中

create or replace PROCEDURE  "DEMO"  
(
PARM_YEAR IN NUMBER,    
PARM_PERIOD IN NUMBER, 
PARM_PERIOD_TYPE IN CHAR,
PARM_PERIOD_ROLL IN CHAR, 
PARM_TYPE IN VARCHAR2,
P_CURSOR IN OUT types.cursorType
)

IS

LOC_EXISTS NUMBER;

LOC_TYPE_PERIOD CHAR(2);
LOC_CURSOR_YEAR INTEGER;
LOC_CURSOR_PERIOD INTEGER;
LOC_CURSOR_TYPE_PERIOD CHAR(2 BYTE);
LOC_CURSOR_DEV_COPCL NUMBER(10,1); 
LOC_CURSOR_DIST_GRP  NUMBER(3,0);

CURSOR DIST_CHART IS


SELECT  X.YEAR , X.PERIOD, X.TYPE_PERIOD, X.COST AS DEV_COPCL

FROM
SMY_PRVDR_TYPE_PRVDR X;

BEGIN

/* Set Period type */

IF (PARM_PERIOD_TYPE = 'Q' AND PARM_PERIOD_ROLL = 'A') THEN
    LOC_TYPE_PERIOD := 'Q';
ELSE IF (PARM_PERIOD_TYPE = 'Q' AND PARM_PERIOD_ROLL = 'R') THEN
    LOC_TYPE_PERIOD := 'RQ';
ELSE IF (PARM_PERIOD_TYPE = 'M' AND PARM_PERIOD_ROLL = 'A') THEN
    LOC_TYPE_PERIOD := 'M';
ELSE
    LOC_TYPE_PERIOD := 'RM';


END IF;
END IF;
END IF;


 LOC_EXISTS := 0;
   SELECT 1 INTO LOC_EXISTS
     FROM ALL_TABLES
    WHERE TABLE_NAME LIKE '%DEMO1%';

   IF LOC_EXISTS = 1 THEN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE DEMO1';
END IF; 


OPEN DIST_CHART;

LOOP 

  FETCH DIST_CHART INTO LOC_CURSOR_YEAR, LOC_CURSOR_PERIOD, LOC_CURSOR_TYPE_PERIOD, 
   LOC_CURSOR_DEV_COPCL;

EXIT WHEN DIST_CHART%NOTFOUND;

SELECT DIST_GRP(LOC_CURSOR_DEV_COPCL) INTO LOC_CURSOR_DIST_GRP FROM DUAL;


EXECUTE IMMEDIATE 'INSERT INTO DEMO1 VALUES  ('|| LOC_CURSOR_YEAR ||', '''|| 
LOC_CURSOR_PERIOD || ''', '''|| LOC_CURSOR_TYPE_PERIOD ||''', '|| LOC_CURSOR_DEV_COPCL 
||', '|| LOC_CURSOR_DIST_GRP || ')';

END LOOP;

CLOSE DIST_CHART;


 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 LOC_EXISTS:=0;

  END;
问题是。。 当我在sql中执行此存储过程时,开发人员数据将成功插入全局临时表

但是

当我在SQLPLUS中运行相同的execute命令时,过程成功运行,但数据并没有插入到全局临时表中

GTT的代码为

CREATE GLOBAL TEMPORARY TABLE "ICUSER"."DEMO1" 
 (  "YEAR" NUMBER(4,0), 
    "PERIOD" NUMBER(2,0), 
    "TYPE_PERIOD" CHAR(2 BYTE), 
    "DEV_COPCL" NUMBER(*,1), 
    "DIST_GRP" NUMBER(3,0)
  ) ON COMMIT PRESERVE ROWS ;

如何确认数据未插入全局临时表。通过收集统计数据从SQL*plus?运行时。oracle临时表中的Bcoz实际存在。数据一直存在,直到会话激活。好吧,我不清楚如何通过收集统计数据来确信数据不存在。你介意把它编辑到你的帖子里吗?收集表格的统计数据。。你们不知道关于这张桌子的所有信息吗?或者告诉我你对术语“聚集统计”的理解??根据我的记忆,dbms_stats.Gather_table_stats不返回任何数据。这就是为什么我要问你们们是如何确定这个切题的问题是为什么要使用这样一个复杂的方法而不是直接的查询。哦,好吧。