说我的UDO(用户定义的对象)是:
create or replace
TYPE UDO_PERSON AS object (NAME VARCHAR2(100), AGE INTEGER);
Run Code Online (Sandbox Code Playgroud)
我有一个PL/SQL函数
create or replace
FUNCTION CREATE_A_PERSON(NAME VARCHAR2)
RETURN UDO_PERSON
AS
AGE INTEGER;
BEGIN
SELECT dbms_random.value(1,100) INTO AGE FROM DUAL;
RETURN NEW UDO_PERSON(NAME, AGE);
END CREATE_A_PERSON;
Run Code Online (Sandbox Code Playgroud)
我测试了以下方法并且它有效,并且有方法可以"解析"结果
...
String select = "SELECT CREATE_A_PERSON('my name') FROM DUAL";
Statement stmt=conn.createStatement();
ResultSet rs= stmt.executeQuery(select);
rs.next();
java.sql.Struct jdbcStruct = (java.sql.Struct)rs.getObject(1);
Object[] attrs = jdbcStruct.getAttributes();
for(int i=0;i<attrs.length;i++){
System.out.println("attrs["+i+"] "+attrs[i].toString());
}
...
Run Code Online (Sandbox Code Playgroud)
但我想要使用的是CallableStatement:
String procedure = "{? = call CREATE_A_PERSON (?)}";
CallableStatement statement …Run Code Online (Sandbox Code Playgroud) 所以我需要从Employee表(idEmployee,name等)到创建帐户的真实用户进行映射.我决定添加一个表Mapping_Employee_User(idEmployee,userName),如下所示
CREATE TABLE Mapping_Employee_User(
idEmployee NUMBER(6)
CONSTRAINT FK_Mapping_Employee_User1 REFERENCES Employee (idEmployee),
userName VARCHAR2(30 BYTE)
CONSTRAINT FK_Mapping_Employee_User2 REFERENCES ALL_USERS(USERNAME),
CONSTRAINT PK_Mapping_Employee_User PRIMARY KEY (idEmployee, userName)
);
Run Code Online (Sandbox Code Playgroud)
但我得到" ORA01031权限不足原因:试图更改当前的用户名或密码..."但我实际上并没有这样做,我只是想做一个参考.
注意:我对此用户拥有完整的权利
记录为SYS我可以看到实际的表名为"USER $",我找不到表ALL_USERS ...无论如何我怎么做这种引用?
此触发器的执行失败(它编译但一旦我执行指定的插入 -> 错误)
create or replace
TRIGGER AFT_INSERT_TMP_TBL
AFTER INSERT ON TMP_TBL
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
V_SQL VARCHAR2(1000);
A_NAME VARCHAR2(100);
BEGIN
A_NAME:='ANY_NAME';
V_SQL:='BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => '''||A_NAME||''',
job_type => ''PLSQL_BLOCK'',
job_action => ''BEGIN DBMS_OUTPUT.PUT_LINE('||A_NAME||'); END;'',
start_date => TIMESTAMP''2011-12-4 10:30:00'',
repeat_interval => ''FREQ=MINUTELY;INTERVAL=2'',
auto_drop => FALSE,
comments => '''||A_NAME||''');
END;';
DBMS_OUTPUT.PUT_LINE('SCHEDULER :'||V_SQL);
EXECUTE IMMEDIATE V_SQL;
END AFT_INSERT_TMP_TBL;
-----------------------
Run Code Online (Sandbox Code Playgroud)
打印的 SCHEDULER 创建代码是完全有效的。
我收到 ORA-04092 'cannot in a trigger... 触发器试图提交或回滚。重写触发器,使其不提交或回滚'。
这是“承诺”吗?所以不能在触发器内部创建作业?
我知道我已经使用触发器插入不同的表,这也是一个“提交”,Oracle 没有抱怨。