student_no
列的数据类型是什么?列名暗示它是一个NUMBER
。但是,您正在调用lower
它并将其与会话用户进行比较的事实意味着它是一个VARCHAR2
。
假设student_no
为VARCHAR2
,则一个问题是您的谓词缺少该值周围的单引号。如果v_student_no
是,例如“ jcave”,则您out_string
将
1=2 or student_no = jcave
由于未引用“ jcave”,因此Oracle假定它必须是标识符,因此它将在名为的表中查找列jcave
。没有找到这样的列,它将引发错误。如果在字符串两边加上单引号,则会更有运气
out_string := out_string||'or student_no = '''||v_student_no||''' ';
可能还会有其他错误。您是否尝试过手动调用该函数以查看其返回的确切信息?如果您在session_user
设置为“ jcave”时手动调用了该函数,那么您应该已经看到缺少单引号的结果。如果您复制并粘贴返回值并将其添加到SELECT
语句的末尾,则会立即看到错误。v$vpd_policy
如果要避免手动调用该函数,还可以查询以查看已添加到特定sql语句中的特定策略谓词- 当您尝试调试会话状态为VPD的VPD问题时,这非常有用。您不容易复制。