Определите значение препроцессора из командной строки с помощью MSBuild [дубликат]

1118 То, что вы описали, не имеет особого смысла. Если есть несколько таблиц, содержащих столбец, который вы проверяете, и выходите из цикла, как только найдете первый, как насчет остальных из них?

Вот что я сделал бы, посмотрите, помогает. Я создам функцию (не процедуру), которая возвращает таблицу . Для этого я сначала создам тип (ы):

SQL> create or replace type t_record as object (tn varchar2(30), cnt number);
  2  /

Type created.

SQL> create or replace type t_table as table of t_record;
  2  /

Type created.

SQL>

Функция:

  • в цикле курсора FOR Я выбираю таблицы, которые содержать, что столбец
  • L_STR используется для составления оператора SELECT
  • DBMS_OUTPUT.PUT_LINE используется для его первого отображения, чтобы я мог визуально проверить, правильно ли он установлен или нет ,
  • Если это так, я запускаю его с EXECUTE IMMEDIATE
  • , результат сохраняется в виде таблицы и возвращается вызывающей стороне

[111 ]

Тестирование:

SQL> select * from table (f_colname('DEPTNO', '10'));

TN                                    CNT
------------------------------ ----------
TEST_201812                             1
DEPT                                    1
EMP                                     3

SQL> select * from table (f_colname('ENAME', 'KING'));

TN                                    CNT
------------------------------ ----------
EMP                                     1
BONUS                                   1

SQL>

Это не будет работать должным образом для некоторых типов данных (таких как DATE) и должно быть скорректировано, если необходимо.


[РЕДАКТИРОВАТЬ: после того, как вы отредактировали вопрос]

Хорошо, тогда это еще проще. Это все еще должна быть функция (которая возвращает логическое значение, поскольку вы сказали, что - в случае, если что-то найдено - вы хотите вернуть TRUE). Код во многом похож на предыдущую функцию.

SQL> create or replace function f_colname
  2    (par_column_name  in varchar2,
  3     par_column_value in varchar2
  4    )
  5    return boolean
  6  is
  7    l_str  varchar2(200);
  8    l_cnt  number;
  9    retval boolean := false;
 10  begin
 11    for cur_r in (select table_name
 12                  from user_tab_columns
 13                  where column_name = par_column_name
 14                 )
 15    loop
 16      l_str := 'select count(*) from ' || cur_r.table_name ||
 17               ' where ' || par_column_name || ' = ' ||
 18               chr(39) || par_column_value || chr(39);
 19      -- Display l_str first, to make sure that it is OK:
 20      -- dbms_output.put_line(l_str);
 21      execute immediate l_str into l_cnt;
 22      if l_cnt > 0 then
 23         retval := true;
 24         exit;
 25      end if;
 26    end loop;
 27    return retval;
 28  end;
 29  /

Function created.

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

SQL> declare
  2    l_ret boolean;
  3  begin
  4    if f_colname('DEPTNO', '15') then
  5       dbms_output.put_line('It exists');
  6    else
  7       dbms_output.put_line('It does not exist');
  8    end if;
  9  end;
 10  /
It does not exist

PL/SQL procedure successfully completed.

SQL>
19
задан Brian Tompsett - 汤莱恩 8 July 2016 в 15:38
поделиться

2 ответа

Это - дубликат этого , и да,/p:DefineConstants действительно хорошо работает, и конфигуратор является правильным, это переопределит ВСЕ условные символы, уже определенные в Файле Проекта (который хорош, по моему скромному мнению), таким образом, необходимо будет определить их всех.

9
ответ дан 30 November 2019 в 04:21
поделиться

Попробуйте

msbuild /p:DefineConstants=DEBUG;DEMO MySolution.sln

, необходимо включать ОТЛАДКУ или ВЫПУСК и любые другие константы, уже определенные в файле решения, но я думаю, что это должно работать.Отказ от ответственности: Я на самом деле никогда не пробовал его сам.

14
ответ дан 30 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: