st :='SELECT USERNAME FROM LOGIN WHERE USERNAME =: a and PASSWORD =: b';
execute immediate st into un using username,pw;
或者
SELECT USERNAME INTO un FROM LOGIN WHERE USERNAME = username and PASSWORD = pw;
其中username
,un
和pw
是varchar2(50)
变量
答案 0 :(得分:4)
每个PL/SQL
将在执行前首先编译。这里的编译涉及PL / SQL结构的语法检查和对正在使用的SQL的语义检查。
通过EXECUTE IMMEDIATE运行SQL意味着,查询将被动态解析和执行。然后我们将其命名为 Dynamic SQL。动态SQL是使用字符串形成的,而查询因此事先并不为Oracle所知。并且只有在运行时,它才会被编译和执行。
然而,在另一种方法中,SQL
在编译期间被解析用于语义检查。我们将其称为 Static SQL。我们得到了编译过程中所有无效的SQL语句错误。
另一个主要区别是,在PROCEDURE
或FUNCTION
中使用静态SQL时。 Oracle会使用Procedure
/ function
创建该表名的依赖关系。您可以在dba_dependencies表中找到它们。
创建这样的依赖项是非常重要的,因为当通过修改函数中引用的列名来更改表或者删除表/视图/类型本身时,Oracle将INVALIDATE
功能。因此,确保,我们没有得到意外的异常。但是DYNAMIC sqls将是完全匿名的并且没有创建依赖项。由于这个原因,您可能会收到ORA-942 TABLE OR VIEW DOESNOT EXISTS
错误,只有DYNAMIC sql而不是静态SQL。
以下查询将列出过程或函数中引用的所有表名,可以是同义词(表引用的交叉模式,没有模式名称),表名直接使用模式名称(或默认模式)
select
proc_syn.referenced_owner,
proc_syn.referenced_name,
proc_syn.referenced_type,
syn_tab.table_name
from
dba_dependencies proc_syn, dba_synonyms syn_tab, dba_tables tables
where
proc_syn.name= 'YOUR_PROC'
AND REFERENCED_TYPE in ( 'SYNONYM','TABLE')
AND proc_syn.referenced_name = syn_tab.synonym_name
AND syn_tab.synonym_name = tables.table_name
AND syn_tab.owner = 'PUBLIC'
order by
proc_syn.referenced_owner, syn_tab.table_name;
答案 1 :(得分:1)
立即执行用于调用动态SQL以获取更多信息,请参阅oracle Documents