Как получать стоимость VARCHAR PL/SQL?

Я нуждаюсь в том, чтобы знать, как я могу получать стоимость одного VARCHAR, не как символ, если не как Ваш контент. Я объясняюсь лучше:

NOMBRE VARCHAR2 (30) := 'JMARTINEZG','JPOLANIA';
select * from DOCUMENTOS D WHERE D.NU_ANO_CALENDARIO = '2016'
AND D.ID_LOGIN_USUARIO_ACTUALIZA IN (NOMBRE)

У меня есть один Query который я должен перемещать переменную VARCHAR имя, которое, он содержит 'JMARTINEZG','JPOLANIA' и мне нужно, чтобы он работал с одним IN.

Я благодарен за помощь, которую они могут предлагать мне, и надеюсь, что предалось понимать.

1
задан 11.06.2016, 01:25
5 ответов

В Скл Сервер и PostgreSql возможно вооружать консультацию в переменной и потом выполнять ее. Оно было бы чем-либо подобным:

PostgreSql PLSQL

$BODY$
DECLARE

lcSQL character varying;
Nombre  text;
BEGIN

Nombre:= 'JMARTINEZG','JPOLANIA';
lcSQL:='select *from DOCUMENTOS D
WHERE D.NU_ANO_CALENDARIO = ''''2016''''
AND D.ID_LOGIN_USUARIO_ACTUALIZA IN (' || Nombre  || ')';

EXECUTE (lcSQL);

END;
$BODY$

Скл Сервер

Declare @Nombre as VARCHAR (30) 
declare @lcSql as text

Set @Nombre= 'JMARTINEZG','JPOLANIA';
set  @lcSql='select *from DOCUMENTOS D
WHERE D.NU_ANO_CALENDARIO = ''''2016''''
AND D.ID_LOGIN_USUARIO_ACTUALIZA IN (' + @Nombre  + ')'

Exec( @lcSql)
2
ответ дан 24.11.2019, 14:37
  • 1
    и для случая PL/SQL, уже я старался выполнять это и nop ни один из двух выборов???. – Gdaimon 06.04.2016, 23:03
  • 2
    К чему ты старался выполнять? – Ariel Octavio D'Alfeo 07.04.2016, 14:48

То, что ты мог бы делать, состоит в том, чтобы создавать тебе временную таблицу с 1 или 2 полями COD, ИМЕНЕМ и вводить их во временной таблице, что сначала ты был бы должен делать, состоит в том, чтобы иметь функцию, которую отделяла бы цепь из-за какого-то характера функция f_split, это реализует и возвращает тебе pipelined.

  FUNCTION f_split (p_list VARCHAR2, p_del VARCHAR2 := ',')
      RETURN split_tbl PIPELINED
   IS
      l_idx     PLS_INTEGER;
      l_list    VARCHAR2 (32767) := p_list;
      l_value   VARCHAR2 (32767);
   BEGIN
      LOOP
         l_idx := INSTR (l_list, p_del);

         IF l_idx > 0
         THEN
            PIPE ROW (SUBSTR (l_list, 1, l_idx - 1));
            l_list := SUBSTR (l_list, l_idx + LENGTH (p_del));
         ELSE
            PIPE ROW (l_list);
            EXIT;
         END IF;
      END LOOP;

      RETURN;
   END f_split;

Сейчас ты, должно быть, введешь в ненастье

insert into tmp SELECT ROWNUM numfila, COLUMN_VALUE nombre
                FROM TABLE (f_split (p_cadena, p_separador));


select * from DOCUMENTOS D WHERE D.NU_ANO_CALENDARIO = '2016'
AND D.ID_LOGIN_USUARIO_ACTUALIZA IN (SELECT NOMBRE FROM TMP);

и удалять стоимость ненастье, если бы уже ты не нуждался в них.

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

1
ответ дан 24.11.2019, 14:37

Если у тебя есть Имена "JMARTINEZG" и также "JPOLANIA", ты можешь так:

SELECT *
FROM DOCUMENTOS D
WHERE D.NU_ANO_CALENDARIO = '2016'
AND D.ID_LOGIN_USUARIO_ACTUALIZA = @NOMBRE

После (pseudocode):

@NOMBRE = "JMARTINEZG"

- или:

@NOMBRE = "JPOLANIA"
0
ответ дан 24.11.2019, 14:37
  • 1
    поскольку он мог бы оценивать это, благодаря тому, что этот varible прибывает как параметр процедуры, посылать мне String с несколькими именами – Gdaimon 06.04.2016, 20:02

Привет,

Для этого особенного случая он рекомендовал бы тебе использовать динамический курсор, который был бы построен во время выполнения:

Declare
  Type type_cursor Is Ref Cursor;
  cu_query     type_cursor;
  lc_query     Varchar2(500);
  lc_campo_1   DOCUMENTOS.codindic%Type;
  lc_campo_2   DOCUMENTOS.valindic%Type;
  lc_campo_3   DOCUMENTOS.desindic%Type;

  lc_valores   Varchar2(50) := '''JMARTINEZG'', ''JPOLANIA'''; -- ¡Cuidado con el manejo de las ' simples!
Begin
  lc_query  := 'Select campo_1, campo_2, campo_3';
  lc_query  := lc_query||' From   DOCUMENTOS D';
  lc_query  := lc_query||' Where  D.nu_ano_calendario = ''2016''';
  lc_query  := lc_query||' And    D.id_login_usuario_actualiza In ('||lc_valores||')';  
  dbms_output.put_line(lc_query); -- Output para controlar la ejecución de la consulta armada.
  Open cu_query For lc_query;  
  Loop
    lc_campo_1 := Null; 
    lc_campo_2 := Null;
    lc_campo_3 := Null;
    Fetch cu_query Into lc_campo_1, lc_campo_2, lc_campo_3;
    Exit When cu_query%NotFound;
    dbms_output.put_line(lc_campo_1||' - '||lc_campo_2||' - '||lc_campo_3);
  End Loop;
End;

Для этого решения только ты был бы должен иметь в виду управление простых кавычек (') очень в момент произвождения консультации (так как это направляет многий из испытания и ошибку), для этого я рекомендую тебе использовать output вооруженного query и проверять, что этот находился в синтаксисе довольно вооружено.

0
ответ дан 24.11.2019, 14:37

В PL/SQL ты вооружаешь консультацию dinámicamente, как он появляется в примере PostgreSql, который он показывает @ariel-octavio-dalfeo в Вашем ответе, и потом это выполняешь с командой EXECUTE IMMEDIATE, которая используется точно, чтобы выполнять решения SQL, содержавшие внутри цепи.

0
ответ дан 24.11.2019, 14:37