Oracle 如何从函数中插入单引号以在select语句中调用

Oracle 如何从函数中插入单引号以在select语句中调用,oracle,plsql,Oracle,Plsql,我正在尝试为VPD编写一个函数,以阻止用户基于其运行的主机/计算机运行select查询。我想我已经完成了大部分的函数,但是我无法解决如何将变量转换成单引号的问题。我需要用引号括起来,这样我就可以对具有允许连接列表的表运行select语句(例如-select*from table,其中v_host='host';) 这是到目前为止我尝试过的一种变体,但我也尝试过其他几种,我觉得我有点头疼: declare v_host VARCHAR2(100); v_host2 VARCHAR2

我正在尝试为VPD编写一个函数,以阻止用户基于其运行的主机/计算机运行select查询。我想我已经完成了大部分的函数,但是我无法解决如何将变量转换成单引号的问题。我需要用引号括起来,这样我就可以对具有允许连接列表的表运行select语句(例如-select*from table,其中v_host='host';)

这是到目前为止我尝试过的一种变体,但我也尝试过其他几种,我觉得我有点头疼:

declare
    v_host VARCHAR2(100);
    v_host2 VARCHAR2(100);
begin
    v_host := q'[SYS_CONTEXT('USERENV','HOST')]';
    dbms_output.put_line(v_host);
end;
/

这就是你要找的吗

SQL> declare
  2      v_host VARCHAR2(100);
  3      v_host2 VARCHAR2(100);
  4  begin
  5      v_host := SYS_CONTEXT('USERENV','HOST');
  6      dbms_output.put_line(v_host);
  7
  8      v_host2 := chr(39) || v_host || chr(39);
  9      dbms_output.put_line(v_host2);
 10  end;
 11  /
LITTLEFOOT
'LITTLEFOOT'

PL/SQL procedure successfully completed.

SQL>

如果是,我做了什么?将
v_host
连接到单引号(
chr(39)
)。

不完全清楚您希望变量包含什么,但看起来您可能需要:

v_host := q'[select * from table where v_host = ']'
    || SYS_CONTEXT('USERENV','HOST') || q'[']';
但这里有一些变化:

declare
    v_host VARCHAR2(100);
begin
    v_host := q'[SYS_CONTEXT('USERENV','HOST')]';
    dbms_output.put_line(v_host);
    v_host := q'[select * from table where v_host = 'host']';
    dbms_output.put_line(v_host);
    v_host := q'[select * from table where v_host = SYS_CONTEXT('USERENV','HOST')]';
    dbms_output.put_line(v_host);
    v_host := q'[select * from table where v_host = ']'
        || SYS_CONTEXT('USERENV','HOST') || q'[']';
    dbms_output.put_line(v_host);
end;
/
产生:

SYS\u上下文('USERENV','HOST')
从表中选择*,其中v_host='host'
从v_host=SYS_CONTEXT('USERENV','host')的表中选择*
从表中选择*,其中v_host='dbfiddle-oracle18xe.localdomain'

非常感谢,我这样做了:``声明v_主机VARCHAR2(100);v_host2 VARCHAR2(100);begin v_host:=q'[']'| | SYS_CONTEXT('USERENV','host')| | q'[']';dbms_output.put_line(v_主机);结束;/`这给了我:“ud005998”