#php #oracle
#php #Oracle
Вопрос:
У меня небольшая проблема. Этот PHP-скрипт автоматически создает таблицы в базе данных Oracle.
Теперь я хотел бы проверить, может ли он создавать таблицы в базе данных Oracle. Если да, то они удаляются. В MySQL это делается через «если существует».
Но как в Oracle-Database?
$conn = null;
include "../conn/oci_conn.php";
function dbConstructor($conn)
{
// IDM_CATEGORY
$sql = 'CREATE TABLE "IDM_CATEGORY"(
"CAT_HASH" VARCHAR2(10),
"CAT_ACTIVE" CHAR(1 BYTE),
"CAT_NAME_DE" VARCHAR2(100 BYTE),
"CAT_LOCATION" VARCHAR2(20 BYTE),
"CAT_NAME_EN" VARCHAR2(100 BYTE)
)';
oci_execute(oci_parse($conn, $sql)) or die(oci_error());
echo "- Table IDM_CATEGORY created successfully<br>";
// IDM_SUBMITTERS
$sql = 'CREATE TABLE "IDM_SUBMITTERS"(
"SU_PERSNUM" NUMBER(*,0),
"SU_IDHASH" VARCHAR2(20 BYTE),
"SU_PERCENT" FLOAT(126)
)';
oci_execute(oci_parse($conn, $sql)) or die(oci_error());
echo "- Table IDM_SUBMITTERS created successfully<br>";
}
dbConstructor($conn);
$conn = null;
Комментарии:
1. Ха, не понимаю вопроса. Вы хотите проверить, существует ли таблица в oracle, прежде чем пытаться ее создать?
Ответ №1:
У Oracle нет такой конструкции, как if not exists
при создании таблиц.
Вместо этого вы должны проверить, существует ли таблица самостоятельно.
Это можно сделать, выполнив поиск записей в таблице USER_TABLES
:
select count(*) from USER_TABLES where TABLE_NAME = 'YOUR_TABLE_NAME'
Вы можете выполнить этот выбор заранее:
<?php
...
$sql = 'select count(*) from USER_TABLES where TABLE_NAME = 'IDM_CATEGORY'';
$stmt = oci_parse($conn, $sql) or die(oci_error());
oci_execute($stmt) or die(oci_error());
$row = oci_fetch_array($stmt, OCI_NUM);
oci_free_statement($stmt);
if (empty($row[0])) { // got zero
$sql = 'CREATE TABLE "IDM_CATEGORY"(
...
)';
oci_execute(oci_parse($conn, $sql)) or die(oci_error());
echo "- Table IDM_CATEGORY created successfully<br>"
} else {
echo "- Table IDM_CATEGORY already exists!<br>"
}
Или другой подход: вы можете выполнить блок pl / sql на стороне Oracle. Вы не можете выполнять create table
внутри блока pl / sql, но вы можете использовать execute immediate
:
<?php
...
$sql = '
declare
vCnt number;
begin
select count(*) into vCnt from USER_TABLES where TABLE_NAME = 'IDM_CATEGORY';
if vCnt = 0 then
execute immediate `
CREATE TABLE "IDM_CATEGORY"(
"CAT_HASH" VARCHAR2(10),
"CAT_ACTIVE" CHAR(1 BYTE),
"CAT_NAME_DE" VARCHAR2(100 BYTE),
"CAT_LOCATION" VARCHAR2(20 BYTE),
"CAT_NAME_EN" VARCHAR2(100 BYTE)
)';
end if;
end;
';
oci_execute(oci_parse($conn, $sql)) or die(oci_error());
echo "- Table IDM_CATEGORY created successfully<br>";
UPD
Если вы хотите удалить таблицу, которая существует, прежде чем воссоздавать ее (я не уверен, что это хорошая практика, потому что таблица может содержать некоторые полезные данные), вы можете использовать тот же подход, просто инвертировать логику: выполнять drop
только тогда, когда таблица существует.
Или вы можете выполнить более простой pl / sql, который просто отключит исключение ORA-00942:
begin
execute immediate 'drop table YOUR_TABLE_NAME';
exception
when others then
if SQLCODE <> -942 then -- Mute only ORA-00942: Table or view does not exists
raise; -- reraise others
end if;
end;
Комментарии:
1. Решение на языке PL / SQL является хорошим, поскольку оно сокращает «обходы» между PHP и Oracle DB, тем самым повышая производительность и масштабируемость. Я прочитал исходный вопрос как желание удалить любую существующую таблицу.