Nano Hash - криптовалюты, майнинг, программирование

Как использовать список строк, разделенных запятыми, в качестве параметра хранимой функции pl/sql внутри предложения NOT IN оператора select

У меня есть список строк, разделенных запятыми (из пользовательского ввода), и я хотел бы использовать этот список в качестве параметра в хранимой функции pl/sql во вложенном блоке sql, используя предложение «не в том месте».

Я не могу найти элегантный способ заставить его работать...

Вот о чем я думаю:

CREATE TABLE example ( somevalue VARCHAR(36) NOT NULL);
--
INSERT INTO example VALUES ('value1');
INSERT INTO example VALUES ('value2');
INSERT INTO example VALUES ('value3');
--
SELECT * FROM example;
--
CREATE OR REPLACE
  FUNCTION resultmaker(
      ignoreList IN VARCHAR2)
    RETURN VARCHAR2
  IS
    result VARCHAR2(4000);
  BEGIN
    result  := 'Here is my calculated result, using ignorelist=' || ignoreList || ':'     || CHR(10);
    FOR rec IN
    (SELECT DISTINCT somevalue
    FROM example
    WHERE somevalue NOT IN resultmaker.ignoreList -- here's my issue, the NOT IN     clause using the parameter value
    )
    LOOP
      result := result || 'not in ignorelist: ' || rec.somevalue || CHR(10);
    END LOOP;
    result := result || '.' || CHR(10);
    --
    RETURN result;
  END resultmaker;
  /
--
-- simulate function call with user input 'value2, value3'
SELECT resultmaker('value2, value3') FROM dual; -- doesn't work  
--
DROP TABLE example;
DROP FUNCTION resultmaker;
04.01.2013


Ответы:


1

Просто передайте параметр, например '"value2","value3"', и замените двойную кавычку одинарными, например REPLACE(@Param1,'"','''').

Вызов функции: SELECT * FROM Function1('"value2","value3"')

Внутренняя функция: NOT IN REPLACE(@Param1,'"','''')

14.10.2015

2

В любом случае вы должны проанализировать этот ввод. Поскольку в PL/SQL нет встроенного токенизатора строк (по крайней мере, я не смог его найти). Вы можете изучить эти параметры,

http://blog.tanelpoder.com/2007/06/20/my-version-of-sql-string-to-table-tokenizer/

Имеет ли PL/SQL эквивалент StringTokenizer для Java?

После того, как вы проанализировали строку, вы можете создать новую строку, например:

not_in_statement varchar2(1000);
CURSOR c1 IS select token from tokenized_strings_table;
BEGIN
    not_in_statement := '('
    FOR rec IN c1 LOOP
        not_in_statement := not_in_statement || '''||rec.token||'''||','
    END LOOP
    not_in_statement := not_in_statement||')'
END

SELECT DISTINCT somevalue
FROM example
WHERE somevalue NOT IN not_in_statement

Возможно, вам нужно сделать его динамическим SQL, у меня не было времени попробовать.

04.01.2013
  • Спасибо Канбурак за ответ! Указание мне на динамический sql было ключом. Я могу управлять представлением списка, разделенного запятыми, вне pl/sql, поэтому решение с использованием динамического sql мне подходит. 04.01.2013
  • Я опубликую свое новое решение в качестве ответа, как только смогу (на данный момент у меня недостаточно репутации, и мне нужно ждать 8 часов) 04.01.2013

  • 3

    Вот мое решение с использованием динамического sql для моего исходного вопроса выше:

    CREATE TABLE example ( somevalue VARCHAR(36) NOT NULL);
    --
    INSERT INTO example VALUES ('value1');
    INSERT INTO example VALUES ('value2');
    INSERT INTO example VALUES ('value3');
    --
    SELECT * FROM example;
    --
    CREATE OR REPLACE
      FUNCTION resultmaker(
          ignoreList IN VARCHAR2)
        RETURN VARCHAR2
      IS
        result VARCHAR2(4000);
        example_cursor sys_refcursor;
        rec example.somevalue%type;
      BEGIN
        result := 'Here is my calculated result, using ignorelist=' || ignoreList || ':' || CHR(10);
        OPEN example_cursor FOR ( 'SELECT DISTINCT somevalue FROM example WHERE somevalue NOT IN (' || ignoreList || ')' );
        FETCH example_cursor INTO rec;
        WHILE example_cursor%found
        LOOP
          result := result || 'not in ignorelist: ' || rec || CHR(10);
          FETCH example_cursor INTO rec;
        END LOOP;
        CLOSE example_cursor;
        result := result || '.' || CHR(10);
        --
        RETURN result;
      END resultmaker; 
    /
    --
    -- simulate function call with user input 'value2', 'value3'
    SELECT resultmaker('''value2'', ''value3''') FROM dual;
    --
    DROP TABLE example;
    DROP FUNCTION resultmaker;
    
    04.01.2013

    4

    Классическим и, вероятно, правильным решением было бы использовать таблицу PL/SQL, передавая ее в качестве параметра...

    04.01.2013

    5

    На asktom.oracle.com есть несколько хороших решений, касающихся получения строки значений и динамического создания для них предложения IN:

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:210612357425

    05.01.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..