Ответы пользователя по тегу SQL
  • Как исключить ошибку пустого запроса в 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
    Во-первых, права на функции в пакете не выдаются. Выдаются права на EXECUTE пакета.
    Во-вторых, если из-под пользователя ASD запрос выполняется без ошибки, значит с правами все ОК.
    В-третьих, разницу результатов можно объяснить тем, что в представление на вход подаются разные значения параметров. К ним в том числе надо отнести пользовательские и системный контексты.
    Считаю необходимым обратить внимание, что если используется конвейерная функция, то она проглатывает ошибку NO_DATA_FOUND.
    Ответ написан
    Комментировать
  • Что должен знать SQL разработчик?

    @Oraclist
    Прежде, чем развивать компетенции в какой-то конкретной технологии СУБД, надо сначала прокачаться в теории БД.
    Что такое множества. Операции над множествами. Сущности (поля, кортежи, таблицы, индексы, последовательности, транзакции и т.д.). Связи таблиц (виды и типы связей). Доступ к данным и т.д.
    А уже потом выбирать или не выбирать конкретную технологию.

    А то бывает приходят люди с опытом PLSQL, вроде и код пишет и стандартные функции знает.
    А про левое/правое соединение ни гугу.

    Добавлено: про нормальные формы забыл еще написать
    Ответ написан
    2 комментария
  • Как убрать пробелы в столбце в начале каждого значения?

    @Oraclist
    update product t 
    set t.product_code = trim(t.product_code) 
    where t.product_code != trim(t.product_code);

    Можно без условия where. Смотреть надо не сломается ли чего (например, какие-нибудь потребители смотрят на дату последнего обновления строки).
    Ответ написан
    3 комментария
  • Какая последовательность выполнения у group by, having, order by?

    @Oraclist
    Последовательность понял правильно. Молодец!
    1. WHERE -> 2. GROUP BY -> 3. HAVING -> 4. ORDER BY
    Т.е. сначала фильтруем - получаем тот набор кортежей, с которыми будем работать дальше.
    Затем группируем в нужном разрезе.
    Затем накладываем условие на результат группировки (а условие на результат можно наложить только после получения результата). Затем сортируем полученный результат для возвращения клиенту.
    Никаких временных таблиц не создается (привет любителям materialize). Порядок выполнения определяется планом запроса и он в общем случае может сильно отличаться от структуры текста запроса.

    Теперь можно разбираться последовательностью выполнения в иерархических запросах (connect by).
    Ответ написан
  • Как написать сложный SQL запрос?

    @Oraclist
    Вопрос не понятен от слова совсем.

    Сразу скажу.
    Несмотря на то, что условия пишутся одинаково, необходимо разделять условия связи двух таблиц и условия фильтрации/отбора. Логически условия отбора фильтруют итоговый массив строк, полученный после связывания всех таблиц. Технически фильтрация может выполняться раньше.
    Т.о. условия связи в данной задаче надо оставить под инструкцией ON, а условия фильтрации вынести в инструкцию WHERE.

    И да, (совет №1) не забывайте писать алиас таблицы перед именем поля, даже если в другой таблице такого поля нет. Ведь завтра оно может там появиться и код работать не будет. Научитесь (совет №2) придумывать короткие алиасы к таблица. А лучше систему получения коротких алиасов. Это пригодится в будущем, когда количество таблиц в системе и в запросе станет увеличиваться.

    Возможно, я неправильно предположил суть вопроса, но должно получиться что-то похожее на
    SELECT
    	c.id
      , c.pagetitle
      , c.parent
      , tv.id
      , tv.tmplvarid
      , tv.contentid
      , tv.value 
    FROM modx_site_content AS c 
    RIGHT JOIN modx_site_tmplvar_contentvalues AS tv ON c.id = tv.contentid
    WHERE c.parent = 22923
      AND ( tv.tmplvarid, tv.value ) IN ( ( 20, 4 ), ( 20, 6 ), ( 19, 10 ) )
    ORDER BY c.id ASC


    И последнее. Мне на 99% кажется, что исходя из имен таблиц, здесь должен быть не RIGHT, а LEFT JOIN.
    Ответ написан
    Комментировать
  • Почему оператор 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.
    Ответ написан
    Комментировать
  • Как одним запросом получить данные из 2х строк выборочно?

    @Oraclist
    Сергей, не понятна постановка задачи.
    Будьте добры, то же самое, только другими словами.
    Ответ написан
  • Как составить запрос к бд с удалением дубликатов и изменением id?

    @Oraclist
    Описание задачи недостаточное
    Не понятен смысл таблиц. Где Primary? Где справочники и значения? и т.д.
    Ответ написан
    Комментировать
  • Как лучше сохранять в базу данных номера телефонов?

    @Oraclist
    ИМХО, правильный ответ - как требуется потребителям (другим системам).
    Можно сделать несколько полей:
    1 - эталонный формат номера varchar2(20 char). Например, 79898112211
    2 - преобразованный формат номера. Например, +7 (989) 811-22-11.
    При добавлении выдавать пользователю вопрос, хотите стандартно или нестандартно + варианты нестандартных написаний и т.д.
    Эталонный формат хранить обязательно. Как ключ. И хранить преобразованный, чтобы не выполнять каждый раз преобразование при обращении.
    Ответ написан
    9 комментариев