2016-03-04 42 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(); 
... 

希望它可以幫助某人,因爲我從互聯網上獲得所有提示。

相關問題