Ответы пользователя по тегу Oracle
  • Как добавить свой столбец в SQL вывод?

    @Oraclist
    SELECT COUNT(d.id) AS КОЛИЧЕСТВО, CASE WHEN d.status = '3' THEN 'ОШИБКА' ELSE 'УСПЕШНО' END AS СТАТУС
    FROM deal d
    WHERE d.status IN ('3', '4')
    GROUP BY CASE WHEN d.status = '3' THEN 'ОШИБКА' ELSE 'УСПЕШНО' END
    Ответ написан
    Комментировать
  • Как исключить ошибку пустого запроса в ORACLE?

    @Oraclist
    Простейший способ, таки, обработать ошибку no_data_found.
    Ориентировочный скрипт такой
    AS 
      INSERTED VARCHAR(200);
      ID_ NUMBER;
    BEGIN
    ...
    BEGIN
    SELECT ID_MATERIAL INTO INSERTED FROM SOURCE WHERE SHORTNAME_MATERIAL=SHORT_NAME;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN NULL ; (или INSERTED := NULL)
    END;
    ...
    IF INSERTED IS NULL THEN
    ...
    ELSE
    ...
    END IF ;
    ...
    END <PROCEDURE_NAME> ;

    А вообще, по приведенному примеру можно сказать, что над оформлением кода (стандартом оформления) надо работать. Имена переменных и таблиц такими делать не принято. Используют преффиксы VAR_, V_, GV_, LV_ для переменных и преффиксы TBL_, T_ или суффикс _TBL для таблиц. Вместо VARCHAR должен быть VARCHAR2. Обязательно указывать тип размерности для строковых - BYTE or CHAR. Алиасы для таблиц являются хорошим тоном даже в таких простых запросах. Невозможно понять условие SHORTNAME_MATERIAL=SHORT_NAME - это сравнение полей картежа, двух скалярных внутренних или внешних переменных, или констант, или сравнение поля с переменной/константой.
    Ответ написан
    1 комментарий
  • Как создать точную копию таблицы?

    @Oraclist
    Можно попробовать приладить DBMS_REDEFINITION. Но как-то криво это.
    Ответ написан
    Комментировать
  • Аудит пользователя SYS, как?

    @Oraclist
    Оффтоп. По-моему, вы боретесь с симптомами, а не с болезнью. SYS имеет исключительные права. Если надо он может всё, в том числе включить и отключить любой аудит. В аудите нет смысла, если его можно обойти. Это как аудировать пользователя root в Unix.
    Ответ написан
    4 комментария
  • Какую из этих книг лучше купить для изучения СУБД компании Oracle?

    @Oraclist
    "Том Кайт - Oracle для профессионалов" или ее оригинал Thomas Kyte "Expert one-on-one Oracle"
    Ответ написан
    1 комментарий
  • На чтение чего нужны права, что бы прочитать представление?

    @Oraclist
    Во-первых, права на функции в пакете не выдаются. Выдаются права на EXECUTE пакета.
    Во-вторых, если из-под пользователя ASD запрос выполняется без ошибки, значит с правами все ОК.
    В-третьих, разницу результатов можно объяснить тем, что в представление на вход подаются разные значения параметров. К ним в том числе надо отнести пользовательские и системный контексты.
    Считаю необходимым обратить внимание, что если используется конвейерная функция, то она проглатывает ошибку NO_DATA_FOUND.
    Ответ написан
    Комментировать
  • Разрешено ли при покупке Oracle Database Standard 2 (т.е. 12с) использовать предыдущую 11g?

    @Oraclist
    А смысл? 12c поддерживает все (или почти все) функции 11g. Я думаю, можно выставить на 12c параметры (compatible & optimizer_features_enable) в 11.2.0.4.0 и будет счастье.

    А по теме ... Покупая Oracle, вы покупаете не только СУБД, но и ее поддержку. А, насколько я помню, по 11g поддержка прекращена.
    Ответ написан
  • Можно ли sql запросом получить схему БД Oracle?

    @Oraclist
    Ну и последний вариант export/import схемы с ROWS=0 (без данных). Не совсем SQL, но может пригодиться.
    Ответ написан
    Комментировать
  • Почему оператор update не работает?

    @Oraclist
    Я вам рекомендую переделать этот код.
    В наличие пренебрежение некоторыми нормами разработки.
    1.
    id in number

    СУБД дает вам возможность создавать имена переменных длинной до 32 символов. Так пользуйтесь этим. Придумайте нормальное имя, например, id_certificate.

    2.
    currentSequence NUMBER(10,0);
    BEGIN
    currentSequence := 0;
    Я верю, что вам платят не за строчки кода. Такое надо объединять в
    currentSequence NUMBER(10,0) := 0 ;


    3. Поле с именем ID это зло. Когда сущностей в системе станет к 100. Вы будете путаться в этих ID как ребенок в буквах.

    4.
    currentSequence := 0;
    SELECT
    max(vr.CERTIFICATE) INTO currentSequence
    FROM
    VAGON_REGISTR vr
    WHERE
    vr.ID = id;

    На этот код должен был ругнуться WARNING'ом компилятор. Типа, значение присваивается, но не используется и снова присваивается в команде выбора.

    5. Команда выхода из блока return должна быть одна. Для ветвления алгоритмов есть If & Case etc.

    6. Про commit (или rollback) уже писали выше.

    7. И да, Oracle не знает camelcase'а GetCertificateSeq. Лучше делать так Get_Certificate_Seq
    Ответ написан
    Комментировать
  • Как исправить ошибку ORA-00904 в Oracle?

    @Oraclist
    ORA-00904 часто отражает отсутствие доступа к объекту.
    Возможно, объекта нет вообще.
    1. Проверить наличие объекта.
    2. Проверить, что обращаемся к нужному объекту правильно (имя схемы и имя объекта корректны и полны)
    3. Проверить наличие прав доступа на выбор для этого объекта и пользователя, выполняющего запрос.
    4. Для представления: пользователю-владельцу представления должны быть выданы права на доступ к таблицам из представления с опцией WITH GRANT OPTION.
    Ответ написан
    Комментировать
  • Какую из IDE выбрать для Oracle PL/SQL?

    @Oraclist
    Для написания кода мне удобней PLSQL Developer.
    Для администрирования у TOAD лучше инструментарий.
    Ответ написан
    Комментировать
  • Почему не соединяется клиент с базой данных Oracle?

    @Oraclist
    По пунктам:
    1. Пробуй подключиться к БД локально (подключаешься по SSH, в командной строке su - oracle, прыгаешь в папку размещения sqlplus, запускаешь sqlplus /nolog, далее conn / as sysdba, вводишь пароль SYS'a.
    Если, ОК значит БД может принимать подключения.
    Заодно проверь, что экземпляр запущен.
    2. Там же из SSH пробуй подключиться через листенер (sqlplus /nolog, вводишь sys@имя_БД, если получишь приглашение на ввод пароля, то всё ОК.
    3. Если нет, то tnsping имя_БД. Если пинга нет, то настраивай tnsnames.ora. Рекомендую хранить только один экземпляр файла с таким именем на хосте. Путь к файлу можно задать через переменную окружения TNS_ADMIN.
    4. Если в п.2. ОК, то повтори п.3 с удаленного хоста.
    5. Если в п.4. ОК, то выгони инопланетян из компьютера)
    6. Если в п.4 не ОК. Пробуй сначала "telnet имя_хоста 1521". Есть приглашение - есть доступ к хосту. Нет приглашения - кури файрвол.
    7. Если есть доступ к хосту и нет связи, настраивай удаленный tnsnames.ora. Рекомендации теже.

    tnsnames.ora расположен в ORA_HOME/NETWORK/ADMIN или по пути в переменной окружения TNS_ADMIN.

    Вот пример одной настройки из файла
    Имя_БД=
    (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=IP_хоста_или_доменное_имя)(PORT=1521))
    (CONNECT_DATA=(SID=SID_БД)(SERVER=DEDICATED))
    )
    SID_БД можно глянуть командой lsnrctl status в командной строке по SSH
    Ответ написан
    Комментировать
  • Какая последовательность в разборе select unique ... у оракла?

    @Oraclist
    CREATE TABLE table1 ( ID NUMBER, KEY NUMBER ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 1, 0 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 2, 1 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 3, 0 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 4, 5 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 5, 4 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 6, 1 ) ;
    CREATE TABLE table2 ( ID NUMBER ) ;
    INSERT INTO table2 ( ID ) VALUES ( 3 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 4 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 5 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 6 ) ;
    COMMIT ;
    SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;

    План исполнения будет следующий
    Plan Hash Value  : 1501084449 
    
    ----------------------------------------------------------------------
    | Id  | Operation              | Name   | Rows | Bytes | Cost | Time |
    ----------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |        |      |       |      |      |
    |   1 |   SORT UNIQUE          |        |      |       |      |      |
    |   2 |    MERGE JOIN          |        |      |       |      |      |
    |   3 |     SORT JOIN          |        |      |       |      |      |
    |   4 |      TABLE ACCESS FULL | TABLE2 |      |       |      |      |
    | * 5 |     SORT JOIN          |        |      |       |      |      |
    |   6 |      TABLE ACCESS FULL | TABLE1 |      |       |      |      |
    ----------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ------------------------------------------
    * 5 - access("T1"."ID"="T2"."ID")
    * 5 - filter("T1"."ID"="T2"."ID")

    План читается с самого "правого" к самому "левому".
    Т.е. сначала самая вложенная строка и вверх по дереву.
    Собственно SORT UNIQUE выполняет предпоследним пунктом.
    Отвечая на вопрос, сначала будет соединение и фильтрация ( строка 5 плана ) и только потом отбор уникальных строк/значений.
    Правильный ответ такой ( не забываем про сортировку )
    SQL> SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;
           KEY
    ----------
             0
             1
             4
             5
    
    SQL>
    Ответ написан
    Комментировать