实现不同session都可以进行同一操作:
这里以发送邮件举例,因为需要在界面上选中需要发送邮件的邮箱地址,不同session可能会需要向不同的邮箱发送邮件,所以需要实现不同session都可以发送邮件。解决方法如下:
一共三种方法,第一种很麻烦,第二种不严谨,第三种最好。
方法一:利用动态sql生成动态表---动态sql传参问题
此方法因为较麻烦,所以后来放弃
a) 步骤:建立sequence,附加到表名后面,并赋值给一个字符型变量,作为参数传入动态sql—create_table,执行语句为:
EXECUTE IMMEDIATE create_table;
同理,写增删改的动态sql,建立package,在Form中调用。
b) 问题:
在form中向动态表插入数据时,出现问题:
问题1: ORA-00936: 缺失表达式。
解决 1: 动态sql执行时,不会自动将空值的参数设置为null。因此form中传入的数据不可以为null。因此得给空值赋默认值。
问题2: ORA-00984: 列在此处不允许。
解决2:因为execute会解析你的脚本直接运行,所有字符类型他不会帮你自动添加单引号。加引号的格式如下:
insert_sql := 'insert into TEMPORY_EMAIL_57_T values(' || p_header_id || ',''' || p_user_name || ''')';---2个引号
方法二:建全局临时表
步骤:在数据库中建一张全局临时表,实现只在当前session有效。
问题:当发送邮件时,会提交另外一个并发请求,此时,若邮件未发送完成,不能再对当前FORM有其他操作,否则将给临时表带来变动。
解决:见方法三。
方法三:建普通表,加一个session_id的字段
步骤:创建表,其中一个字段为session_id。
当打开form时,获取当前会话的session_id,并赋值给表中的session_id字段,获取session_id的sql如下:
SELECT b.object_id,a.session_id
FROM v$locked_object a,
dba_objects b
WHERE b.object_name='ZZOM_SEND_EMAIL';