Поиск данных из таблицы путем передачи имени таблицы в качестве параметра в PL / SQL - PullRequest
2 голосов
/ 07 февраля 2012

Является ли эта хранимая процедура в oracle правильной для поиска данных из таблицы путем передачи имени таблицы в качестве параметра

CREATE OR REPLACE PROCEDURE bank_search_sp
(
    p_tablename  IN  VARCHAR2,
    p_searchname IN  VARCHAR2,
    p_bankcode   OUT VARCHAR2,
    p_bankname   OUT VARCHAR2,
    p_dist_code  OUT NUMBER
)
AS
    v_tem VARCHAR2(5000);
BEGIN
    v_tem := 'SELECT bankcode,bankname,dist_code FROM ' || UPPER (p_tablename) || '
    WHERE bankname LIKE '''|| p_searchname||'''';
    EXECUTE IMMEDIATE v_tem
       INTO p_bankcode,p_bankname,p_dist_code
      USING p_searchname ;
END bank_search_sp;

1 Ответ

1 голос
/ 07 февраля 2012

Если вам нужна эта процедура, то я предполагаю, что у вас есть несколько таблиц со столбцами bankcode, bankname и dist_code. Если это так, попробуйте нормализовать вашу модель, если это возможно.


Термин USING является правильным подходом, но вы должны использовать параметр в своем запросе.

Чтобы избежать внедрения SQL, вы можете использовать dbms_assert.sql_object_name.

Это должно работать для вас:

v_tem := 'SELECT bankcode, bankname, dist_code FROM '
         || dbms_assert.sql_object_name(p_tablename)
         || ' WHERE bankname LIKE :1';

Ваш EXECUTE IMMEDIATE сгенерирует исключение, если не найдет ни одной строки или более одной строки, поэтому использование LIKE может быть не очень хорошей идеей.


Вопросы, которые вы должны задать себе:

  • Правильно ли нормализована модель?
  • Вам действительно нужно использовать LIKE, или =, что вы хотите?
  • Если вы хотите использовать LIKE, как программа должна обращаться с NO_DATA_FOUND / TOO_MANY_ROWS исключениями?
...