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

Установить параметр по умолчанию в виде списка строк Oracle PLSQL

Вот с чем я работаю:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept in VARCHAR2 DEFAULT
'Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT',
'Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting',
Mgr in VARCHAR2 DEFAULT NULL) AS

vManager Varchar2(30) := Mgr;
vDepartment Varchar2(30) := Dept;

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

WHERE m.first_name ||' ' || m.last_name IN (vManager) -- NULL if I don't input anything
  OR d.department_name IN (vDepartment) -- All departments if I don't input anything

Когда я вызываю функцию и ничего не ввожу, я ожидаю вернуть все возможные строки. Это желаемый эффект.


Ответы:


1

Чтобы иметь возможность передавать список строк в качестве параметра, вы должны изменить параметр на список.

CREATE OR REPLACE TYPE t_departments IS TABLE OF VARCHAR2(30);

А затем создайте свою процедуру на основе этого нового типа:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept IN t_departments DEFAULT t_departments('Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT','Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting'), Mgr IN VARCHAR2 DEFAULT NULL) AS

Позже вы можете использовать MEMBER OF вместо IN, чтобы проверить, есть ли определенное значение в таблице:

 ...
 WHERE d.department_name MEMBER OF Dept 
 ...

В качестве альтернативы, если вы не можете изменить тип параметров процедуры, вы можете просто использовать переменные:

CREATE OR REPLACE PROCEDURE SPROCLABPROCEDURE (Dept IN VARCHAR2 DEFAULT NULL, Mgr IN VARCHAR2 DEFAULT NULL) AS
  TYPE t_departments IS TABLE OF VARCHAR2(30);
  v_all_departments t_departments := t_departments('Administration', 'Marketing', 'Purchasing', 'Human Resources', 'Shipping', 'IT','Public Relations', 'Sales', 'Executive', 'Finance', 'Accounting');
  vManager VARCHAR2(30);
  vDepartment t_departments;
BEGIN
  IF Dept IS NULL THEN
    vDepartment := v_all_departments;
  ELSE
    vDepartment := t_departments(Dept);
  END IF;

  ...

  WHERE d.department_name MEMBER OF vDepartment

  ...

END;
28.03.2014

2

мне кажется тут что-то непонятно...

Во-первых, это процедура, а не функция, поэтому она ничего не вернет.

varchar не является массивом.
Когда вы получаете или возвращаете varchar2 - есть только одна возможная строка для передачи туда и обратно... Если вы хотите использовать список - вы должны проверить типы массива PL/SQL предложения. http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/05_colls.htm

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

Я бы порекомендовал вам ознакомиться с временными таблицами — они являются отличным помощником данных для обмена данными «внутри сеанса» для списка, который вы хотели бы вернуть. http://asktom.oracle , описано выше (например, select ... где last_name в (выбрать менеджера из temptable)).

Другое дело - использование фамилии для идентификации записей в БД - это не то, что вам нужно. Для этого вы можете использовать уникальные идентификаторы и внешние ключи. (если вы не знакомы с терминами - Что такое ограничения базы данных? .

Если я не ответил на ваш вопрос (или указал вам на ответ) - пожалуйста, уточните свой вопрос, так как я не уверен (наверное, как и многие другие), что именно вы хотите сделать (логически).

28.03.2014

3

Совершенно неясно, о чем вы спрашиваете, но вот минимальный пример того, как вы можете передать список значений, которые можно использовать как часть запроса SQL, в подпрограмму PL/SQL:

-- SQL type so that can be used in SQL context (the select-statement)
create or replace type strlist_t is table of varchar2(4000);
/

create or replace procedure foo(p_owners in strlist_t default strlist_t('JANI')) is
begin
  for i in (select * from all_tables 
             where owner in (select * from table(p_owners)))
  loop
    dbms_output.put_line(i.owner || '.' || i.table_name);
  end loop;
end;
/
show errors

begin
  -- define your own criteria
  foo(strlist_t('SYS', 'JANI'));
  -- use the default criteria
  foo;
end;
/

Надеюсь это поможет !

28.03.2014
  • Вместо where owner in (select * from table(p_owners)) используйте where owner member of p_owners. 28.03.2014
  • Новые материалы

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

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

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

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

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

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

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