დინამიური ბაინდინგი Context – ების გამოყენებით


1) საჭიროა შევქმნათ კონტექსტი (ხშირ შემთხვევაში პრივილეგია არ გვაქვს და მოგვიწევს ადმინისტრატორის შეწუხება)…

CREATE OR REPLACE CONTEXT parameter USING context_api;

2) შევქმნათ პაკეტი context_api…

CREATE OR REPLACE PACKAGE context_api AS
PROCEDURE set_parameter(p_name   IN  VARCHAR2,
                        p_value  IN  VARCHAR2);
END context_api;
CREATE OR REPLACE PACKAGE BODY context_api IS
PROCEDURE set_parameter (p_name   IN  VARCHAR2,
                         p_value  IN  VARCHAR2) IS
BEGIN
  DBMS_SESSION.set_context('parameter', p_name, p_value);
END set_parameter;
END context_api;

3) შედეგი სახეზეა…

აქამდე თუ გვიწევდა კოდის წერა ასე:

CREATE OR REPLACE FUNCTION emp_count (
  p_job     IN  emp.job%TYPE     DEFAULT NULL,
  p_deptno  IN  emp.deptno%TYPE  DEFAULT NULL) 
  RETURN NUMBER AS

  l_sql     VARCHAR2(32767);
  l_number  NUMBER;
BEGIN

  l_sql := 'SELECT COUNT(*) INTO :l_number FROM emp WHERE 1=1 ';

  IF p_job IS NOT NULL THEN
    l_sql := l_sql || 'AND job = :job ';
  END IF;

  IF p_deptno IS NOT NULL THEN
    l_sql := l_sql || 'AND deptno = :deptno ';
  END IF;
  
  DBMS_OUTPUT.PUT_LINE(l_sql);
  
  CASE
    WHEN p_job IS NOT NULL AND p_deptno IS NULL THEN
      EXECUTE IMMEDIATE l_sql INTO l_number USING p_job;
    WHEN p_job IS NULL AND p_deptno IS NOT NULL THEN
      EXECUTE IMMEDIATE l_sql INTO l_number USING p_deptno;
    WHEN p_job IS NOT NULL AND p_deptno IS NOT NULL THEN
      EXECUTE IMMEDIATE l_sql INTO l_number USING p_job, p_deptno;
    ELSE
      EXECUTE IMMEDIATE l_sql INTO l_number;
  END CASE;
  
  RETURN l_number;
END emp_count;

ახლა მოგვიწევს ასე:

CREATE OR REPLACE FUNCTION emp_count (
  p_job     IN  emp.job%TYPE     DEFAULT NULL,
  p_deptno  IN  emp.deptno%TYPE  DEFAULT NULL) 
  RETURN NUMBER AS

  l_sql     VARCHAR2(32767);
  l_number  NUMBER;
BEGIN

  l_sql := 'SELECT COUNT(*) INTO :l_number FROM emp WHERE 1=1 ';

  IF p_job IS NOT NULL THEN
    context_api.set_parameter('job', p_job);
    l_sql := l_sql || 'AND job = SYS_CONTEXT(''parameter'',''job'') ';
  END IF;

  IF p_deptno IS NOT NULL THEN
    context_api.set_parameter('deptno', p_deptno);
    l_sql := l_sql || 'AND deptno = SYS_CONTEXT(''parameter'',''deptno'') ';
  END IF;
  
  DBMS_OUTPUT.PUT_LINE(l_sql);
  
  EXECUTE IMMEDIATE l_sql INTO l_number;
  
  RETURN l_number;
END emp_count;

აბა წარმატებები 😉

დატოვეთ კომენტარი