—— 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 Данные не могут быть возвращены Пустая таблица. Эта проблема только в Global Temporary Table. Я пробовал в Laravel, Codeigniter Та же проблема, и я снова настраиваю опрос Oracle тот же вопрос.
Данные в глобальной временной таблице видны только в течение сеанса. Вы используете пул соединений PHP (ORCL: POOLED), поэтому существует вероятность, что разные вызовы будут подключаться к разным сеансам. Это, безусловно, объясняет, почему у вас периодически возникает ошибка, которая влияет только на запросы GTT.
Это распространенная проблема с веб-приложениями (которые не имеют состояния) и базами данных (которые с большим состоянием).
Что касается исправления, возможно, вам не нужен пул соединений. Но более вероятно, что вам лучше не использовать GTT. На самом деле существует очень мало случаев использования, когда глобальные временные таблицы стоят затрат на их заполнение и чтение. Просто запросите данные, когда вам это нужно.
Других решений пока нет …