Oracle: если существует в базе данных Oracle?

#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, тем самым повышая производительность и масштабируемость. Я прочитал исходный вопрос как желание удалить любую существующую таблицу.