2014-10-14 2 views
4

Так что я изучал программирование на языке C в отношении макросов и их использование, но в моей работе я часто использую PL/SQL, и мне было интересно, есть ли способ сделать это то же самое в PL/SQL. Прямо сейчас у меня есть вызов функции с тремя разными значениями, а затем возврат значения, но функция настолько проста, что я думаю, что могу сделать это изнутри исходной хранимой процедуры. В C a Макро - это строка (или строки) кода, которая просто полностью заменяется вызовом компиляции, но она более эффективна, чем вызов функции снова и снова.Макрос PL/SQL, как в программировании на языке C

Пример из C:

#define query(fieldValue, Attribute, Table) (select fieldValue from Table where record = Attribute) 

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

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

Возможно ли это в SQL? Это должно быть для 2-3 строк кода, вот и все.

Спасибо большое, SMKS

+0

Нет, это не возможное. создайте курсор или функцию. – OldProgrammer

+0

У меня уже есть функция в форме функции, но она становится очень неэффективной. Я думаю, когда функция вызывается как 30 раз из той же процедуры. И курсор не будет работать, потому что мне придется каждый раз менять инструкцию sql, и это будет просто беспорядочно. Таким образом, нет более эффективного способа сделать это? – SMKS

+1

Вы можете использовать динамический sql, который займет некоторое чтение. – OldProgrammer

ответ

1

Просто вслед за комментариями OldProgrammer, я думаю, что вы хотели бы одну функцию, которая использует динамический SQL, чтобы вернуть одно значение из очень подобных заявлений SQL.

Ниже приведен пример того, как это может быть достигнуто:

declare 

    function get_field_val(
     p_field   varchar2, 
     p_table   varchar2, 
     p_where_clause varchar2 
) return varchar2 is 
     v_query  clob; 
     v_result varchar2(4000); 
    begin 

     v_query := 'select to_char(' || p_field ||')' || 
       'from ' || p_table || ' ' || p_where_clause;     

     execute immediate v_query into v_result; 

     return v_result; 

    end; 

begin 

    dbms_output.put_line(
     get_field_val(
      p_field  => 'COLUMN_NAME', 
      p_table  => 'ALL_TAB_COLUMNS', 
      p_where_clause => 'where owner = ''SYS'' and table_name = ''ACCESS$'' 
       and column_id = 1')); 

    dbms_output.put_line(
     get_field_val(
      p_field  => 'max(table_name)', 
      p_table  => 'all_tables', 
      p_where_clause => 'where owner = ''SYS''')); 

end; 

Несколько вещей, чтобы отметить об этом:

  1. Эта функция может возвращать только одно значение VARCHAR. Если вам нужны разные типы или массивы значений, вам нужно будет подойти к этому, используя встроенные или пользовательские коллекции plsql.
  2. Это, вероятно, плохая идея, чтобы сделать этот вид функции общественности, поскольку это означает, что любой может запустить любой запрос с теми же privledges как пакет DEFINER (если вы не создадите его AUTHID CURRENT_USER)
+0

Спасибо за этот ответ, кстати! Использование динамического sqltook мне некоторое время, чтобы понять, но это очень полезно. – SMKS

 Смежные вопросы

  • Нет связанных вопросов^_^