我正在编写一个需要动态生成一些查询的PL/SQL过程,其中一个过程涉及使用作为参数的查询结果创建临时表.
CREATE OR REPLACE PROCEDURE sqlout(query IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE tmp_tab AS (' || query || ');';
END;
Run Code Online (Sandbox Code Playgroud)
它编译正确,但即使使用非常简单的查询,例如:
BEGIN
sqlout('SELECT * FROM DUAL');
END;
Run Code Online (Sandbox Code Playgroud)
IT抛出ORA-00911: invalid character.如果我手动运行创建的查询,它会正确运行.在这一点上,我能够确定导致问题的原因.
我有一个抛出的代码行
Oracle异常 - ORA-00911:无效字符
在尝试以下C#代码时:
double tempDateTimeObj = Convert.ToDouble(someClass.GetTime(tempObjID, objStartTime, todayTime).Rows[0][0]);
Run Code Online (Sandbox Code Playgroud)
GetTime是一个函数,它进行SQL调用,接受上面看到的变量,SQL调用OUTs为Oracle数字类型,然后GetTime C#函数DataTableCollection Tables每次返回一行对象.
public static DataTable GetTime(string tempObjID, DateTime objStartTime, DateTime todayTime)
{
string sql = "select some_pkg.get_time('" + tempObjID + "', to_date('" + objStartTime + "', 'mm/dd/yyyy hh:mi:ss am'), to_date('" + todayTime + "', 'mm/dd/yyyy hh:mi:ss am')) from dual;";
return <connection object>.getDS(sql).Tables[0];
}
Run Code Online (Sandbox Code Playgroud)
如果我调试,抓取具有变量值的sql字符串,并将其抛入Oracle SQL Developer,它可以正常工作并在SQL Dev控制台中返回一个数字.但是,当我调试并遇到该行时,C#代码会抛出00911异常.由于字符串sql已在Oracle SQL Dev中测试过,因此语法应该有效.鉴于有效的语法,为什么VS2010会抛出此错误/异常?
编辑: 这是一个用C#构建并发送到数据库的示例字符串:
select some_pkg.get_time('23569245', to_date('11/8/2012 1:21:06 PM', 'mm/dd/yyyy hh:mi:ss am'), to_date('12/31/2012 12:52:18 AM', 'mm/dd/yyyy hh:mi:ss am')) from …Run Code Online (Sandbox Code Playgroud) 我有一批sql语句,如...
插入.... ; 插入.... ; 删除.........;
等等
当我尝试对oracle执行它们时它给了我这个错误(ORA-00911无效字符)
现在我可以理解这是因为语句之间的分号,我在SQL Server上尝试了这个并且它起作用但是在Oracle中没有运气到目前为止.
有没有办法使用ExecuteScalar或其他一些函数对oracle运行多个语句?
DUPLICATE:如何使用.NET执行多个Oracle SQL语句
我正在尝试在一个Execute Immediate语句中运行多个ddl语句.我认为这将是非常直接的,但似乎我错了.
这个想法是这样的:
declare v_cnt number;
begin
select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS';
if v_cnt = 0 then
execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))';
end if;
end;
Run Code Online (Sandbox Code Playgroud)
但是这会导致错误
ORA-00911:无效字符ORA-06512:第10行
如果我自己执行它们,批处理中的每个语句都可以正常运行.如果我接受这个语句并执行它,它将运行良好(使用;在两个语句之间).如果我删除; 在语句之间我得到关于无效选项的不同错误
计划是我将能够构建一个表,导出该表的表模式,包括它的所有alter语句,然后作为安装/更新过程的一部分对另一个系统运行批处理.
那么,我如何在单个执行立即批处理这些DDL语句?或者有更好的方法来做我需要的东西吗?
我必须承认,我有点像甲骨文新手.谢谢大家的耐心等待.
我正在运行一个PHP脚本,用于从Oracle DB更新表.首先,我收到一个带有JSON的对象:
[{"lot":"KLMHA17N9N00","requestor":"B10078","id":"FRESHLOT","username":"B26696","password":"B26696"},{"lot":"KLMHA17R1800","requestor":"B10078","id":"FRESHLOT"}]
Run Code Online (Sandbox Code Playgroud)
自从我在其他项目中使用JSON以来没有任何问题.
然后我在将结果解析为$ rmrid对象后创建查询:
$db_query = "update ao_lots
set RMRID='".$rmrid->requestor."-".$rmrid->id."'
where ALOT_NUMBER='".$rmrid->lot."';";
Run Code Online (Sandbox Code Playgroud)
如果我回应查询,我得到这个:
update ao_lots
set RMRID='B10078-FRESHLOT'
where ALOT_NUMBER='KLMHA17N9N00';
Run Code Online (Sandbox Code Playgroud)
我没有看到任何问题,但是当我执行查询时,我收到此警告并且没有更新任何内容:
警告:oci_execute()[function.oci-execute]:ORA-00911:无效字符
我对该错误代码进行了一些搜索,但我找不到我发现的信息
任何建议将不胜感激
我在Oracle数据库上存储过程时遇到了一些问题.
我只想调用一个过程(它有50个IN参数和2个IN OUT参数)并获得这2个OUT参数.
我正在尝试执行()相关的CallableStatement,但它返回一个NullPointerException
java.lang.NullPointerException
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:977)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1363)
...
Run Code Online (Sandbox Code Playgroud)
这是代码(我正在使用Hibernate):
Session session = (Session) HibernateUtil.currentSession();
final Transaction transaction = session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
try {
CallableStatement call = connection.prepareCall("{?,? = call geneva_admin.bksgnvcrmps.createorreturnproduct1nc(" +
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," +
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," +
"?,?,?,?,?,?,?,?,?,?,?,?)}");
int i = 1;
call.registerOutParameter(i++, Types.INTEGER);
call.registerOutParameter(i++, Types.VARCHAR);
call.setString(i++, typeofproduct);
call.setString(i++, shiptositenumber);
call.setString(i++, billtositenumber);
call.setString(i++, ordernumber);
call.setInt(i++, orderid);
...
call.setInt(i++, errcode);
call.setString(i++, errmsg);
call.execute();
System.out.println("err_code: " + call.getString(1));
System.out.println("err_msg: " + call.getString(2)); …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过ODP.NET执行SQL查询来创建表,但我总是得到一个ORA-00911'无效字符'错误.即使SQL查询本身没有换行符,异常中的Errors对象也始终具有文本"ORA-00911:invalid character \n".
我正在执行SQL的代码是这样的:
using (OracleConnection conn = new OracleConnection(<connection string>) {
using (OracleCommand command = conn.CreateCommand()) {
conn.Open();
command.CommandText = queryString;
command.ExecuteNonQuery(); // exception always gets thrown here
}
Run Code Online (Sandbox Code Playgroud)
queryString包含一个CREATE TABLE语句,在通过SQL Developer执行时可以正常工作
编辑:我正在执行的SQL是这样的:
CREATE TABLE "TESTSYNC"."NEWTABLE" (
"COL1" NUMBER(*,0) NULL,
"COL2" NUMBER(*,0) NULL
);
Run Code Online (Sandbox Code Playgroud)
删除了换行符
我在Eclipse中执行一个简单的数据库查询:
statement.executeUpdate(
"INSERT INTO DBUSER(USER_ID,USERNAME,CREATED_BY,CREATED_DATE)
VALUES (3,'KUMAR','ERPDIRECT',to_date('29/08/2011', 'dd/mm/yyyy'));"
);
Run Code Online (Sandbox Code Playgroud)
但我得到:
ORA-00911:无效的字符错误
但是当在sql*plus命令行中执行此查询时,它正在执行而不会失败.
我尝试连接到oracle 11g,但我有问题并收到以下错误.错误显示我的sql语法必须有问题,但我在oracle sql developer中运行它.查询是对的请帮我解决这个问题
谢谢.
try {
string oradb = "Data Source=(DESCRIPTION="
+ "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx-PC)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));"
+ "User Id=xxxx;Password=123456;";
OracleConnection con = new OracleConnection();
con.ConnectionString = oradb;
//String command = "Select Object_name,status from object_name where object_type='" + object_typeCB.SelectedText + "'";
string command = "select column1,column2,column3 from table1;";
OracleDataAdapter oda = new OracleDataAdapter();
oda.SelectCommand = new OracleCommand();
oda.SelectCommand.Connection = con;
oda.SelectCommand.CommandText = command;
con.Open();
oda.SelectCommand.ExecuteNonQuery();
DataSet ds = new DataSet();
oda.Fill(ds);
dataGridView1.DataSource = ds;
con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString()+Environment.NewLine+ …Run Code Online (Sandbox Code Playgroud)