PHP ORACLE GLOBAL TEMPORARY TABLE

时间:2018-05-30 21:26:38

标签: php oracle oracle12c global-temp-tables

----- PHP --------

<?php
    $c = oci_new_connect("system", "1234", "127.0.0.1:1521/ORCL:POOLED");
    oci_execute(oci_parse($c,"CALL pr_test()"));
    $s = oci_parse($c, 'select * from GTT_TABLEs');
    oci_execute($s);
    oci_fetch_all($s, $res);
    var_dump($res);   
?>



--- Global Temporary Table ----    
CREATE GLOBAL TEMPORARY TABLE "SYSTEM"."GTT_TABLES" 
   (    "ID" NUMBER(10,0) NOT NULL ENABLE, 
    "FIRSTNAME" VARCHAR2(191 BYTE), 
    "LASTNAME" VARCHAR2(191 BYTE), 
    "EMAIL" VARCHAR2(191 BYTE), 
    "POINTS" VARCHAR2(191 BYTE), 
    "NOTES" VARCHAR2(191 BYTE), 
    "CREATED_AT" TIMESTAMP (6), 
    "UPDATED_AT" TIMESTAMP (6), 
    "AGE" NUMBER(10,0), 
    "JOB" VARCHAR2(191 BYTE), 
    "GENDER" VARCHAR2(191 BYTE), 
    "COUNTRY" VARCHAR2(191 BYTE), 
    "SALE_DATE" VARCHAR2(191 BYTE)
   ) ON COMMIT PRESERVE ROWS ;  



--- PROCEDURE -----            
create or replace PROCEDURE PR_TEST  AS
BEGIN
DELETE GTT_TABLED;  
INSERT INTO GTT_TABLES (SELECT * FROM DATATABLES);
COMMIT;
END;

Php(7.2.1)(持久性)和oracle(12c)全局临时表Issue.Some Times数据无法获取返回空表。此问题仅在全局临时表中。我在Laravel中尝试过,Codeigniter相同问题和我配置Oracle轮询同样的问题。

1 个答案:

答案 0 :(得分:1)

全局临时表中的数据仅在会话中可见。您正在使用PHP连接池(ORCL:POOLED),因此不同的调用可能会连接到不同的会话。这肯定可以解释为什么你会出现间歇性错误,这只会影响查询GTT。

这是Web应用程序(无状态)和数据库(具有大量状态)的常见问题。

至于修复它,也许你不需要连接池。但是你最好不要使用GTT。实际上很少有用例,全局临时表值得填充和读取它们的开销。只需在需要时查询数据。