【问题标题】:PHP Oracle issue with Global Temporary Table全局临时表的 PHP Oracle 问题
【发布时间】:2018-06-05 19:13:25
【问题描述】:

我正在使用 PHP 7.21 和 Oracle 12c。我在使用全局临时表时遇到问题。有时数据返回一个空表,而我只遇到临时表的问题。我已经在 Laravel 和 CodeIgniter 中尝试过,但问题仍然存在。我下面的代码中有什么明显的问题吗?

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);   

SQL 代码:

--- 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 oracle laravel oracle-call-interface oci8


    【解决方案1】:

    临时表中的数据仅对您的会话可见,因此 - 除了您之外,没有人可以看到或使用它。那是你的情况吗?如果是这样,切换到“正常”表;您将需要一些额外的标识符来帮助您区分不同用户之间的数据。

    另外,我建议您不要在 SYSTEM(或 SYS)模式中创建自己的对象,这正是您目前正在做的事情。

    【讨论】:

    • 如果没有紧密的连接,我有时无法获取数据。有时它可以完美运行,而我的架构不在系统中。
    • CREATE GLOBAL TEMPORARY TABLE "SYSTEM"."GTT_TABLES" - 这是 SYSTEM 模式中的一个表,为 Oracle 保留。
    • 恐怕我不能调试“有时”,你必须这样做。是的,您的架构 is SYSTEM: CREATE GLOBAL TEMPORARY TABLE "SYSTEM"."GTT_TABLES" ...
    • 对不起,这是一个例子..我的方案名称是 GSADMIN
    • 如果你这么说......无论如何,我为什么要关心?这是您的数据库,您可以随时将其崩溃。
    【解决方案2】:

    这是一个例子,也是打字错误。

    --- Global Temporary Table ----
    CREATE GLOBAL TEMPORARY TABLE "GSFIN"."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 GSFIN.GTT_TABLES;
    INSERT INTO GSFIN.GTT_TABLES (SELECT * FROM GSFIN.DATATABLES);
    COMMIT;
    END;
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2011-02-15
      • 2017-10-02
      • 2023-03-27
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多