2016-03-04 40 views
1

如何将BOOLEAN传递给12c中的Oracle程序?如何将BOOLEAN传递给Oracle 12c过程?

我听说在12c之前是不可能的,但我仍然无法在12c中完成。

// https://docs.oracle.com/cd/A91202_01/901_doc/appdev.901/a89852/d_metad8.htm 
// PROCEDURE set_transform_param (
//  transform_handle  IN NUMBER, 
//  name     IN VARCHAR2, 
//  value     IN BOOLEAN DEFAULT TRUE, 
//  object_type    IN VARCHAR2 DEFAULT NULL); 
var cmd = new OracleCommand(); 
cmd.Connection = new OracleConnection(this.scon); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "DBMS_METADATA.SET_TRANSFORM_PARAM"; 
cmd.BindByName = true; 
cmd.Parameters.Add("transform_handle", OracleDbType.Int64).Value = -1; 
cmd.Parameters.Add("name", OracleDbType.Varchar2).Value = "STORAGE"; 
cmd.Parameters.Add("value", "N"); 
cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 

我试过以下,但得到一个错误。

"0", "F", "N", '0', 'F', 'N' 

错误:

ORA-31600: invalid input value "0" for parameter STORAGE in function SET_TRANSFORM_PARAM 
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105 
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8680 
ORA-06512: at "SYS.DBMS_METADATA_INT", line 10027 
ORA-06512: at "SYS.DBMS_METADATA", line 7458 
ORA-06512: at line 1 

回答

0

我有同样的问题。

我解决了问题的解决方法。

1)创建一个包装存储过程,然后你可以使用布尔型或其他参数,如pl-sql;

2)在同一会话(同一个OracleConnection)中调用被包装的存储过程;

3)在同一个会话中调用SELECT DBMS_METADATA.GET_DDL;

... 
OracleCommand command = null; 
string storedprc = "CREATE OR REPLACE PROCEDURE MY_SCHEMA.SET_FK_FALSE AS BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',false); END;"; 
command = new OracleCommand(storedprc, this.Conn); 
command.CommandType = CommandType.Text; 
command.ExecuteNonQuery(); 
//  
command = new OracleCommand(); 
command.Connection = this.Conn; 
command.CommandType = CommandType.StoredProcedure; 
command.CommandText = "MY_SCHEMA.SET_FK_FALSE"; 
command.ExecuteNonQuery(); 
// 
string queryString = "SELECT DBMS_METADATA.GET_DDL('TABLE','MY_TABLE_NAME','MY_SCHEMA') FROM DUAL;"; 
command = new OracleCommand(queryString, this.Conn); 
command.CommandType = CommandType.Text; 
reader = command.ExecuteReader(); 
string ddlScript = null; 
if (reader.Read()) 
{ 
    ddlScript = reader[0].ToString(); 
} 
reader.Close(); 
... 

希望它可以帮助某人,因为我从互联网上获得所有提示。

相关问题