Array Bind: nbr of updated rows?
Hello,
when using array binding with UPDATE statements, how to look up the number of updated rows?
I couldn't find any parameter property such as ArrayBindAffectedRows.
Is it possible to use array bind with SQL statements which return values, e.g.:
UPDATE emp SET salary = salary + :increase
WHERE mgr = :mgrNo
RETURNING salary INTO :newSalary;
Hm, arrays :increase and :newSalary might have different lengths.
Thanks,
Armin
Ok this is genuinly tricky.
The only way I can think of to get this is to use FORALL and BULK COLLECT. This does an array-bound insert from PL/SQL. But you need to pass Associative Arrays from ODP.NET to PL/SQL to get this started.
Any other solution I could think of would require running some PL/SQL code for each update statement, for instance in a trigger. But avoiding the context switches from PL/SQL to SQL is a main reason to use array binding in the first place.
Here's a complete sample program:
I used inline PL/SQL for compactness, but you might want to save the block as a procedure.
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
public class Test
static OracleConnection connect()
string constr = "data source=oracle;user id=scott;password=tiger";
OracleConnection con = new OracleConnection(constr);
con.Open();
return con;
const string sql = @"
declare
type NumTable is table of Number index by binary_integer;
l_managers NumTable := :mgr;
l_increase NumTable := :inc;
l_newSals NumTable;
l_records int;
begin
forall idx in l_managers.first .. l_managers.last
update emp
SET
sal = sal + l_increase(idx)
WHERE mgr = l_managers(idx)
RETURNING sal BULK COLLECT INTO l_newSals;
:records_affected := l_newSals.count;
end;
[STAThread]
static void Main(string[] args)
try
using (OracleConnection con = connect())
string cr = new String(new char[] {(char)13});
OracleCommand cmd = new OracleCommand(sql.Replace(cr,""),con);
OracleDecimal[] increases = new OracleDecimal[] {10,20,30};
int[] managers = new int[] { 7698,7839,7782};
OracleParameter pMgr = cmd.Parameters.Add("manager",
OracleDbType.Int32,
ParameterDirection.Input);
pMgr.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
pMgr.Size = managers.Length;
pMgr.Value = managers;
OracleParameter pInc = cmd.Parameters.Add("increase",
OracleDbType.Decimal,
ParameterDirection.Input);
pInc.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
pInc.Size = increases.Length;
pInc.Value = increases;
OracleParameter pRecs = cmd.Parameters.Add("records",
OracleDbType.Int32 ,
ParameterDirection.Output);
pRecs.CollectionType = OracleCollectionType.None;
cmd.ExecuteNonQuery();
int recs = (int)pRecs.Value;
Console.WriteLine("{0} records affected",recs );
catch (Exception ex)
Console.WriteLine(ex);
}
Similar Messages
-
Reg: PLS-00418: array bind type must match PL/SQL table row type error
I am trying to access a table of records through JDBC OracleCallableStatement. I am able to do it fine for all mappings except for the ones below
TYPE CAT_CD_TYPE IS TABLE OF A.B %TYPE INDEX BY BINARY_INTEGER;
TYPE ORG_CD_TYPE IS TABLE OF C.D %TYPE INDEX BY BINARY_INTEGER;
Column B is CHAR(1) and Column D is CHAR(2). I am trying to register the out parameters of Oraclecallablestatement as
cstmt.registerIndexTableOutParameter(2, 2000, OracleTypes.CHAR, 0);
cstmt.registerIndexTableOutParameter(3, 2000, OracleTypes.CHAR, 0);
All the other mappings work fine. These two fail with the error
SQLException in invokeDBPackage() : ORA-06550: line 1, column 32:
PLS-00418: array bind type must match PL/SQL table row type
ORA-06550: line 1, column 35:
PLS-00418: array bind type must match PL/SQL table row type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
I tried other OracleTypes mappings too but no luck so far.
Any advice on this would be greatly appreciated.Hi,
I'm not sure it's reasonable to expect someone to sift through that much stuff.
Which parameter is it having a problem with?
Can you modify the following to reproduce the behavior?
Thanks
Greg
create package mypack5 as
TYPE v2array is table of emp.ename%type index by BINARY_INTEGER;
PROCEDURE test_it(thearray IN v2array, numrecs out number);
END;
CREATE or replace PACKAGE BODY MYPACK5 AS
PROCEDURE test_it(thearray IN v2array, numrecs out number)
IS
begin
numrecs := thearray.count;
END;
END;
using System;
using System.Data;
using Oracle.DataAccess.Client;
public class indexby
public static void Main()
OracleConnection con = new OracleConnection("data source=orcl;user id=scott;password=tiger;");
con.Open();
OracleCommand cmd = new OracleCommand("mypack5.test_it", con);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter Param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
Param1.Direction = ParameterDirection.Input;
Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
Param1.Size = 3;
string[] vals = { "foo", "bar", "baz" };
Param1.Value = vals;
OracleParameter Param2 = cmd.Parameters.Add("param2", OracleDbType.Int32, DBNull.Value, ParameterDirection.Output);
cmd.ExecuteNonQuery();
Console.WriteLine("{0} records passed in", Param2.Value);
con.Close();
} -
PLS-00418: array bind type must match PL/SQL table row type
If a PL/SQL table is indexed by CHAR and is a parameter
in a Stored Program, we are not able to call the stored
program from the Java code.
We get the following error code.
java.sql.SQLException: ORA-06550: line 1, column 62:
PLS-00418: array bind type must match PL/SQL table row type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
But if we change the CHAR into VARCHAR2 then it works.
We are using Oracle9i Enterprise Edition Release 9.2.0.5.0 -64bit Production ,
JServer Release 9.2.0.5.0 - Production
and JDK1.4.
Thanks
Push..Hi,
I'm not sure it's reasonable to expect someone to sift through that much stuff.
Which parameter is it having a problem with?
Can you modify the following to reproduce the behavior?
Thanks
Greg
create package mypack5 as
TYPE v2array is table of emp.ename%type index by BINARY_INTEGER;
PROCEDURE test_it(thearray IN v2array, numrecs out number);
END;
CREATE or replace PACKAGE BODY MYPACK5 AS
PROCEDURE test_it(thearray IN v2array, numrecs out number)
IS
begin
numrecs := thearray.count;
END;
END;
using System;
using System.Data;
using Oracle.DataAccess.Client;
public class indexby
public static void Main()
OracleConnection con = new OracleConnection("data source=orcl;user id=scott;password=tiger;");
con.Open();
OracleCommand cmd = new OracleCommand("mypack5.test_it", con);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter Param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
Param1.Direction = ParameterDirection.Input;
Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
Param1.Size = 3;
string[] vals = { "foo", "bar", "baz" };
Param1.Value = vals;
OracleParameter Param2 = cmd.Parameters.Add("param2", OracleDbType.Int32, DBNull.Value, ParameterDirection.Output);
cmd.ExecuteNonQuery();
Console.WriteLine("{0} records passed in", Param2.Value);
con.Close();
} -
Using array binding to perform multiple rowupdates in one pass
For the first time I am attempting to use array binding in VB.NET to update multiple rows via a single execution of a stored procedure. My subroutine is:
Friend Sub UpdateSolutionStatusUsingArrays(ByVal intNumBeingUpdated As Integer, ByVal arrScenarioID() As Integer, ByVal arrSolutionID() As Integer, ByVal arrInOrOut() As Integer, ByVal arrTimePeriod() As Integer)
Try
'Set up the Command object
Dim cmdUpdateSolutionStatus As OracleCommand
cmdUpdateSolutionStatus = New OracleCommand
cmdUpdateSolutionStatus.CommandType = CommandType.StoredProcedure
cmdUpdateSolutionStatus.CommandText = "ProcUpdateSolutionStatus"
cmdUpdateSolutionStatus.Connection = cnnORACLE
cmdUpdateSolutionStatus.ArrayBindCount = intNumBeingUpdated - 1
cmdUpdateSolutionStatus.CommandTimeout = CInt(tblOptions.Rows(intDatabaseIndex).Item("ConnectionTimeout"))
'Add ScenarioID array as parameter
Dim p_ScenarioID As New OracleParameter("ScenarioID", OracleDbType.Int32)
p_ScenarioID.Direction = ParameterDirection.Input
p_ScenarioID.Value = arrScenarioID
cmdUpdateSolutionStatus.Parameters.Add(p_ScenarioID)
'Add SolutionID array as parameter
Dim p_SolutionID As New OracleParameter("SolutionID", OracleDbType.Int32)
p_SolutionID.Direction = ParameterDirection.Input
p_SolutionID.Value = arrSolutionID
cmdUpdateSolutionStatus.Parameters.Add(p_SolutionID)
'Add InOrOut array as parameter
Dim p_InOrOut As New OracleParameter("InOrOut", OracleDbType.Int32)
p_InOrOut.Direction = ParameterDirection.Input
p_InOrOut.Value = arrInOrOut
cmdUpdateSolutionStatus.Parameters.Add(p_InOrOut)
'Add TimePeriod array as parameter
Dim p_TimePeriod As New OracleParameter("TimePeriod", OracleDbType.Int32)
p_TimePeriod.Direction = ParameterDirection.Input
p_TimePeriod.Value = arrTimePeriod
cmdUpdateSolutionStatus.Parameters.Add(p_TimePeriod)
'Open connection
cnnORACLE.Open()
'Run stored procedure
cmdUpdateSolutionStatus.ExecuteNonQuery()
'Tidy up
cmdUpdateSolutionStatus = Nothing
cnnORACLE.Close()
Catch ex As Exception
WriteLog("Subroutine UpdateSolutionStatusUsingArrays:" & ex.Message.ToString)
strState = "Error"
'Update Run Status to show error has occurred
cnnORACLE.Close()
UpdateRunStatusORACLE(7)
End Try
End Sub
When the routine tries to run cmdUpdateSolutionStatus.ExecuteNonQuery() I get the error message:
Unable to cast object of type 'System.Int32[]' to type 'System.IConvertible'.
I have tried all sorts of variants of the code but with no success. The arrays are being set up correctly. Anyoneone know what I'm missing?
StewartTry declaring the arrays as OracleNumber datatype instead of Integer. I've had this issue before, and I believe this is what I did to solve the problem.
-
Associative array binding - poor performance
Dear All
i have very very low performence when i am inserting a binary array using associative array bind. i mean when i insert huge jagged binary array.
the jagged array has
BinarryArray[0][0]........BinarryArray[0][8000]
BinarryArray[1][0]........BinarryArray[1][8000]
BinarryArray[3600][0]........BinarryArray[3600][8000]
BinarryArray[0] - i have 8000 byte end so on. total is 3600 X 8000
that means 28,800KB hence to ~28MB.
the C# code is as follows
string strInsert "Insert Into T Values(t.SEQUENCE.currval, :paramArr);
OracleCommand objCommand = new OracleCommand;
OracleParameter objParam = new OracleParameter(paramArr, OracleDbtype.blob, 8000, system.data.ParameterDirection.Input,true,0,0,"ColumnName", system.data.DataRowVersion.Curren, BinarryArray);
objCommandtext = strInsert;
objCommand.ArrayBindCount = BinarryArray.Length;
objCommand.Parameters.Clear();
objCommand.Parameters.Add(paramArr);
objCommand.ExecuteNonQuery();
In generall the Insertion is good for each row in the array i get separate row in the DB but it works so slow.
why??????
see the code belowwell??
-
Exception Handling for Array Binding
Hi
1)
I am using a Stored Procedure.
I am using array binding and if i am sending an array of count 10 to be inserted in a table and only 9 got inserted,i deliberatly inserted one errorneous record in array, the count returned by ExecuteNonQuery() is 10.Why ?
How can i come to know exact number of rows inserted in table, how can i use Output variables, because the array bind count is 10 so if i add an output parameter it gives error ArrayBind count is wrong....
2)
Is it possible to roll back all the inserts if error occurs in any of the insert by Oracle engine.What it does is it inserts all correct records and leaves the errorneous record and doesn't even throw any exception or any message.
Answer - This can be achieved by using OracleTransaction and don't use Exception handling in procedure otherwise there wont be any exception thrown by procedure which is necessary to detect if an error occured during insert.If you use exception handling OracleEngine will insert correct rows and leave errorneous record and return count of inserted + non inserted records which is wrong.
Please help.
Message was edited by:
user556446
Message was edited by:
user556446You'll need to encapsulate your validation within it's own block as described below:
-- this will die on the first exception
declare
TYPE T_BADDATA_TEST IS TABLE OF VARCHAR2(1000) INDEX BY binary_integer ;
tbt T_BADDATA_TEST ;
aBadTypeFound exception ;
begin
tbt(0) := 'a';
tbt(1) := 'b';
tbt(2) := 'c';
for idx in tbt.first..tbt.last loop
if tbt(idx) = 'b' then
raise aBadTypeFound ;
else
dbms_output.put_line(tbt(idx));
end if ;
end loop ;
end ;--encapsulate the exception area in a begin/end block to handle the exception but continue on
declare
TYPE T_BADDATA_TEST IS TABLE OF VARCHAR2(1000) INDEX BY binary_integer ;
tbt T_BADDATA_TEST ;
aBadTypeFound exception ;
begin
tbt(0) := 'a';
tbt(1) := 'b';
tbt(2) := 'c';
for idx in tbt.first..tbt.last loop
BEGIN
if tbt(idx) = 'b' then
raise aBadTypeFound ;
else
dbms_output.put_line(tbt(idx));
end if ;
EXCEPTION
WHEN aBadTypeFound THEN
dbms_output.put_line(tbt(idx) || ' is bad data');
WHEN OTHERS THEN
dbms_output.put_line('exception');
END ;
end loop ;
end ;
output:
a
b is bad data
c
***/ -
ExecuteBatch(): number of successfully updated rows
Hello everybody:
Here is a simple but often a repeated question in java forums:
Requirement:
1.To read a flat file that has many rows of data.
2.Parse the data and update the database accordingly.
3.Find the number of successfully updated rows.
Approach:
After reading the file and parsing its data,
- use PreparedStatement
- use executeBatch()
I found this as unadvisable to use executeBatch() as its implementation is
inherently driver specific. The executeBatch() returns an array of update counts.
Now,can any one tell me, what is the best way to trace the number of successfully
(and unsuccessfully) updated rows by using this count?
Is there any other way to achieve the same by not using executeBatch()?
Can any one share a snippet of code to achieve this specific functionality?
[Need is to log the number of unsuccessful attempts along with their
corresponding rows of data].
Thanks & regards,
Venkat KosigiexecuteBatch submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch. The elements in the array returned by the method executeBatch may be one of the following:
-- A number greater than or equal to zero indicates that the command was processed successfully and is an update count giving the number of rows in the database that were affected by the command's execution
-- A value of -2 indicates that the command was processed successfully but that the number of rows affected is unknown
If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands.
If the driver continues processing after a failure, the array returned by the method BatchUpdateException.getUpdateCounts will contain as many elements as there are commands in the batch, and at least one of the elements will be the following:
-- A value of -3 indicates that the command failed to execute successfully and occurs only if a driver continues to process commands after a command fails.
return values have been modified in the Java 2 SDK, Standard Edition, version 1.3 to accommodate the option of continuing to proccess commands in a batch update after a BatchUpdateException obejct has been thrown.
Throws BatchUpdateException (a subclass of SQLException) if one of the commands sent to the database fails to execute properly or attempts to return a result set. The BatchUpdateException getUpdateCounts() method allows you to known the element who caused the fail identified by a -3 value.
-- So, if you have a succesfully result, look for at the executeBatch returned array ( #values >= 0 ) + ( #values == -2 ) = successes
and if you have not a succesfully result, catching the BatchUpdateException take the array returned by the getUpdateCounts() method, and look for the position in which array values are -3. You could take the data at this position on batch and log it.
-- Other way to insert a bulk copy on database is to use a bcp command ( it�s not java, bcp is an independent command ) that allows you to do bulk inserts from file, indicate an error file, bcp will give to you as result a file with those lines not where inserted.
I hope have help you.;) -
Procedure Array Binding a Null Value
Can you perform array binding in ODP.NET (to a procedure for example that inserts values) and assume that if there are null values in the array that the records inserted will have the corresponding null values in their records?
Here's a quick sample using pl/sql associative arrays to insert null values into a table (I think this is what you mean)...
SQL*Plus: Release 10.1.0.3.0 - Production on Fri Feb 18 09:38:55 2005
Copyright (c) 1982, 2004, Oracle. All rights reserved.
SQL> connect /
Connected.
SQL> create table null_array_insert
2 (
3 first_name varchar2(32) not null,
4 middle_name varchar2(32) null,
5 last_name varchar2(32) not null
6 );
Table created.
SQL> create or replace package null_array_test as
2 -- create a type for each column
3 type t_first_name is table of null_array_insert.first_name%type
4 index by binary_integer;
5
6 type t_middle_name is table of null_array_insert.middle_name%type
7 index by binary_integer;
8
9 type t_last_name is table of null_array_insert.last_name%type
10 index by binary_integer;
11
12 -- the procedures that will perform our work
13 procedure bulk_insert (p_first_name in t_first_name,
14 p_middle_name in t_middle_name,
15 p_last_name in t_last_name);
16 end null_array_test;
17 /
Package created.
SQL> create or replace package body null_array_test as
2 procedure bulk_insert (p_first_name in t_first_name,
3 p_middle_name in t_middle_name,
4 p_last_name in t_last_name) is
5 begin
6 forall i in p_first_name.first..p_first_name.last
7 insert into null_array_insert (first_name,
8 middle_name,
9 last_name)
10 values (p_first_name(i),
11 p_middle_name(i),
12 p_last_name(i));
13 end bulk_insert;
14 end null_array_test;
15 /
Package body created.
Here's the C# code:
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
namespace Associative
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
string connStr = "User Id=/";
OracleConnection oraConn = new OracleConnection(connStr);
oraConn.Open();
// create the command object and set attributes
OracleCommand cmd = new OracleCommand("null_array_test.bulk_insert", oraConn);
cmd.CommandType = CommandType.StoredProcedure;
// create parameter objects for each parameter
OracleParameter p_first_name = new OracleParameter();
OracleParameter p_middle_name = new OracleParameter();
OracleParameter p_last_name = new OracleParameter();
// set parameter type for each parameter
p_first_name.OracleDbType = OracleDbType.Varchar2;
p_middle_name.OracleDbType = OracleDbType.Varchar2;
p_last_name.OracleDbType = OracleDbType.Varchar2;
// set the collection type for each parameter
p_first_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p_middle_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p_last_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
// set the parameter values
p_first_name.Value = new string[4]{"First 1", "First 2", "First 3", "First 4"};
p_middle_name.Value = new string[4]{"Middle 1", "", "Middle 3", ""};
p_last_name.Value = new string[4]{"Last 1", "Last 2", "Last 3", "Last 4"};
// set the size for each array
p_first_name.Size = 4;
p_middle_name.Size = 4;
p_last_name.Size = 4;
// set array bind size for the columns since they
// are a variable size type (varchar2)
p_first_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
p_middle_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
p_last_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
// add the parameters to the command object
cmd.Parameters.Add(p_first_name);
cmd.Parameters.Add(p_middle_name);
cmd.Parameters.Add(p_last_name);
// execute the insert
cmd.ExecuteNonQuery();
p_last_name.Dispose();
p_middle_name.Dispose();
p_first_name.Dispose();
cmd.Dispose();
oraConn.Dispose();
And after running the code:
SQL> select * from null_array_insert;
FIRST_NAME MIDDLE_NAME LAST_NAME
First 1 Middle 1 Last 1
First 2 Last 2
First 3 Middle 3 Last 3
First 4 Last 4
4 rows selected.
SQL> select * from null_array_insert where middle_name is null;
FIRST_NAME MIDDLE_NAME LAST_NAME
First 2 Last 2
First 4 Last 4
2 rows selected.
SQL>Hope that helps,
- Mark -
There was an error while updating row count for "SH".."SH".CHANNELS
Hi All,
Am new to OBIEE.Pls help in this regard.
Am building the physical layer as per Repository guide.When am importing the data in to this,am getting the below error.
*"There was an error while updating row count for "SH".."SH".CHANNELS" :"*
channles is the table name and having 5 rows.
but am able to see the data in the sql prompt. like SELECT * FROM SH.CHANNELS then 5 rows data would be displaying..
pls help in this regard and where is the excat problem?
Thanks,what is the error?
Make sure that your connection pool settings are okay..
Make sure that, you are using correct driver in case of if you are using ODBC dsn..
Also make sure that, your oracle server is running... TNS and Oracle server services -
How can i update rows in a table based on a match from a select query
Hello
How can i update rows in a table based on a match from a select query fron two other tables with a update using sqlplus ?
Thanks Glenn
table1
attribute1 varchar2 (10)
attribute2 varchar2 (10)
processed varchar2 (10)
table2
attribute1 varchar2 (10)
table3
attribute2 varchar2 (10)
An example:
set table1.processed = "Y"
where (table1.attribute1 = table2.attribute1)
and (table1.attribute2 = table3.attribute2)Hi,
Etbin wrote:
Hi, Frank
taking nulls into account, what if some attributes are null ;) then the query should look like
NOT TESTED !
update table1 t1
set processed = 'Y'
where exists(select null
from table2
where lnnvl(attribute1 != t1.attribute1)
and exists(select null
from table3
where lnnvl(attribute2 != t1.attribute2)
and processed != 'Y'Regards
EtbinYes, you could do that. OP specifically requested something else:
wgdoig wrote:
set table1.processed = "Y"
where (table1.attribute1 = table2.attribute1)
and (table1.attribute2 = table3.attribute2)This WHERE clause won't be TRUE if any of the 4 attribute columns are NULL. It's debatable about what should be done when those columns are NULL.
But there is no argument about what needs to be done when processed is NULL.
OP didn't specifically say that the UPDATEshould or shouldn't be done on rows where processed was already 'Y'. You (quite rightly) introduced a condition that would prevent redo from being generated and triggers from firing unnecessarily; I'm just saying that we have to be careful that the same condition doesn't keep the row from being UPDATEd when it is necessary. -
Obiee oracle gateway error while updating row count
Hi ,
OBIEE server 11.1.1.5 ,oracle server11g installed in linux 64bit,
while updating row count in Admin tool i am getting the following error
[NQODBC][SQL_STATE:HY000][nQSError:10058] A general error has occured.
[nQSError: 43113]Message returned from OBIS.
[nQSError:43093]An error occured while processing the EXECUTE PHYSICAL statement.
[nQSError:17003]Oracle gateway error: OCIEnvNIsCreate or OCIEnvInit failed to initialize environment.Please check your Oracle Client installation and make sure the correct version of OCI libraries are in the library path.
i am able to check the database from sqlplus it is working fine.
Any suggestion highly appreciated plzzzMake sure your connection pool is valid and able to import or execute reports.
If everything good as above said, in Physical layer database properties-> general tab choose the database version and try it once.
If not
Check the doc id 1271486.1
Or
To resolve the issue create a softlink (ln -s) in the <OracleBI>/server/Bin folder to link to the 32-bit Oracle Client Driver file.
The example below shows how to perform a softlink from the 64 bit directory:
cd /u10/app/orcladmin/oracle/OracleBI/server/Bin
ln -s $ORACLE_HOME/lib32/libclntsh.so.10.1 libclntsh.so.10.1
If helps mark -
Not able to update row count in Physical Layer..connection failed in OBIEE 11g
Hi Guys,
I am not able to do Update Row count in the Physical Layer, i am getting an error The Connection has failed. This is in OBIEE 11g Linux env.
I have put the tnsnames.ora file in the below path:
/*****/pkgs/linux/intel/OBIEE_DIT/MW_HOME/Oracle_BI1/network/admin/
I do not have admin under
/****/pkgs/linux/intel/OBIEE_DIT/MW_HOME/oracle_common/network/
But if i put the whole TNS entry in the Data Source Name i am able to connect:
(DESCRIPTION =(ADDRESS = (PROTOCOL= TCP) (HOST= xxx.xxx.com) (PORT= 1671))(CONNECT_DATA = (SERVICE_NAME = US1OBIEE)))
I am not able to understand the issue..
Thanks,
AmitLooks like rpd is looking for local tns config... try to use as hostname:port/ServiceName
This should work, just in case not working! stop doing so since it is know issue.
If helps mark -
Cursor and Update rows based on value/date
SQL Server 2012
Microsoft SQL Server Management Studio
11.0.3128.0
Microsoft Analysis Services Client Tools
11.0.3128.0
Microsoft Data Access Components (MDAC)
6.1.7601.17514
Microsoft MSXML 3.0 4.0 5.0 6.0
Microsoft Internet Explorer
9.11.9600.16518
Microsoft .NET Framework
4.0.30319.18408
Operating System
6.1.7601
The objective of this is to test the Cursor and use it on a production environment after this is fixed. What I would like to do is update rows in a column i duplicated originally called 'HiredDate' from AdventureWorks2012 HumanResources.Employee table. I
made a duplicate column called 'DateToChange' and would like to change it based on a date I have picked, which returns normally 2 results (i.e. date is '04/07/2003'). The code runs but will not change both dates. It did run however with an error but changed
only 1 of the 2 rows because it said ['nothing available in next fetch'].
The code to add the columns and perform the query to get the results I am running this against:
-- ADD column 'DateToChange'
ALTER TABLE [HumanResources].[Employee] ADD DateToChange Date NOT NULL;
-- Copy 'HireDate' data to 'DateToChange'
UPDATE HumanResources.Employee SET DateToChange = HireDate;
-- Change 'DateToChange' to NOT NULL
ALTER TABLE [HumanResources].[Employee] ALTER COLUMN DateToChange Date NOT NULL;
SELECT BusinessEntityID,HireDate, CONVERT( char(10),[DateToChange],101) AS [Formatted Hire Date]
FROM HumanResources.Employee
WHERE [DateToChange] = '04/07/2003';
Code:
USE AdventureWorks2012;
GO
-- Holds output of the CURSOR
DECLARE @EmployeeID INT
DECLARE @HiredDate DATETIME
DECLARE @HiredModified DATETIME
DECLARE @ChangeDateTo DATETIME
--Declare cursor
-- SCROLL CURSOR ALLOWS "for extra options" to pul multiple records: i.e. PRIOR, ABSOLUTE ##, RELATIVE ##
DECLARE TestCursor CURSOR SCROLL FOR
-- SELECT statement of what records going to be used by CURSOR
-- Assign the query to the cursor.
SELECT /*HumanResources.Employee.BusinessEntityID, HumanResources.Employee.HireDate,*/ CONVERT( char(10),[DateToChange],101) AS [Formatted Hire Date]
FROM HumanResources.Employee
WHERE DateToChange = '01/01/1901'
/*ORDER BY HireDate DESC*/ FOR UPDATE OF [DateToChange];
-- Initiate CURSOR and load records
OPEN TestCursor
-- Get first row from query
FETCH NEXT FROM TestCursor
INTO @HiredModified
-- Logic to tell the Cursor while "@@FETCH_STATUS" 0 the cursor has successfully fetched the next record.
WHILE (@@FETCH_STATUS = 0 AND @@CURSOR_ROWS = -1)
BEGIN
FETCH NEXT FROM TestCursor
IF (@HiredModified = '04/07/2003')/*05/18/2006*/
-- Sets @HiredModifiedDate data to use for the change
SELECT @ChangeDateTo = '01/01/1901'
UPDATE HumanResources.Employee
SET [DateToChange] = @ChangeDateTo --'01/01/1901'
FROM HumanResources.Employee
WHERE CURRENT OF TestCursor;
END
-- CLOSE CURSOR
CLOSE TestCursor;
-- Remove any references held by cursor
DEALLOCATE TestCursor;
GO
This query is run successfully but it does not produce the desired results to change the dates
04/07/2003 to 01/01/1901.
I would like the query to essentially be able to run the initial select statement, and then update and iterate through the returned results while replacing the necessary column in each row.
I am also open to changes or a different design all together.
For this query I need:
1. To narrow the initial set of information
2. Check if the information returned, in particular a date, is before [i.e. this current month minus 12 months or
12 months before current month]
3. Next replace the dates with the needed date
[Haven't written this out yet but it will need to be done]
4. After all this is done I will then need to update a column on each row:
if the 'date' is within 12 months to 12 months from the date checked
NOTE: I am new to TSQL and have only been doing this for a few days, but I will understand or read up on what is explained if given enough information. Thank you in advance for anyone who may be able to help.The first thing you need to do is forget about cursors. Those are rarely needed. Instead you need to learn the basics of the tsql language and how to work with data in sets. For starters, your looping logic is incorrect. You open
the cursur and immediately fetch the first row. You enter the loop and the first thing in the loop does what? Fetches another row. That means you have "lost" the values from the first row fetched. You also do not test the success of
that fetch but immediately try to use the fetched value. In addition, your cursor includes the condition "DateToChange = '01/01/1901' " - by extension you only select rows where HireDate is Jan 1 1901. So the value fetched into @HiredModified will
never be anything different - it will always be Jan 1 1901. The IF logic inside your loop will always evaluate to FALSE.
But forget all that. In words, tell us what you are trying to do. It seems that you intend to add a new column to a table - one that is not null (ultimately) and is set to a particular value based on some criteria. Since you intend the
column to be not null, it is simpler to just add the column as not null with a default. Because you are adding the column, the assumption is that you need to set the appropriate value for EVERY row in the table so the actual default value can be anything.
Given the bogosity of the 1/1/1901 value, why not use this as your default and then set the column based on the Hiredate afterwards. Simply follow the alter table statement with an update statement. I don't really understand what your logic
or goal is, but perhaps that will come with a better description. In short:
alter table xxx add DateToChange date default '19010101'
update xxx set DateToChange = HireDate where [some unclear condition]
Lastly, you should consider wrapping everything you do in a transaction so that you recover from any errors. In a production system, you should consider making a backup immediately before you do anything - strongly consider and have a good reason not
to do so if that is your choice (and have a recovery plan just in case). -
How to find newly updated rows in a table
Hi..
How to know newly updated rows in a table.
Thanks in advance
palOr other good thing would be to add LAST_UPDATED column to your table, that can reflect the time the row gets updated.
G -
Update Rows with info from other Rows in Same Table.
I'm trying to update rows with information from the same table. The table gets loaded with info from a report that runs and it has to be a new entry every month but I would like to carry over some of the info from last month. This statement below runs but updates all rows in the new table load and in my test cases I only made a few match so only like 5 records should get updated. This is an example of what I'm trying to do. If I add this(C2.COL_INVC_ID = C1.COL_INVC_ID) to the last "*Where*" statement I get an invalid identifier for "C2.COL_INVC_ID". So what am I doing wrong here??? How can I update only the rows that where also in last months run???
Thanks in advance for any help!
Update OpenIssues OI1
Set(OI1.Num, OI1.Status, OI1.Code, OI1.LastModifiedDate) =
(Select OI2.Num, OI2.Status, OI2.Code, OI2.LastModifiedDate
From OpenIssues OI2
Where OI2.num = OI1.num and OI2.TableLoadDate = TO_DATE('01/31/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
Where and OI1.TableLoadDate = TO_DATE('02/29/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
SQLMeHi,
Welcome to the forum!
SQLMe wrote:
I'm trying to update rows with information from the same table. The table gets loaded with info from a report that runs and it has to be a new entry every month but I would like to carry over some of the info from last month. This statement below runs but updates all rows in the new table load and in my test cases I only made a few match so only like 5 records should get updated. This is an example of what I'm trying to do. If I add this(C2.COL_INVC_ID = C1.COL_INVC_ID) to the last "*Where*" statement I get an invalid identifier for "C2.COL_INVC_ID". If the aliases c1 and c2 aren't defined anywhere, then you can't use them anywhere.
The WHERE clause of the UPDATE statement can only reference the table being updated, ot1 in this case.
So what am I doing wrong here??? How can I update only the rows that where also in last months run???
Thanks in advance for any help!
Update OpenIssues OI1
Set(OI1.Num, OI1.Status, OI1.Code, OI1.LastModifiedDate) =
(Select OI2.Num, OI2.Status, OI2.Code, OI2.LastModifiedDate
From OpenIssues OI2
Where OI2.num = OI1.num and OI2.TableLoadDate = TO_DATE('01/31/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
Where and OI1.TableLoadDate = TO_DATE('02/29/2012 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
------------There's a syntax error in the last line. Either something got lost when you posted the code, or you just don't want the keyword AND. You certainly don't want AND immediately after WHERE.
In general, if it's not obvious how to do an UPDATE, then UPDATE is the wrong tool: you want MERGE instead.
Whenever you have a problem, please post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) from all tables involved.
Also post the results you want from that data, and an explanation of how you get those results from that data, with specific examples.
Simplify the problem as much as possible. Remove all tables and columns that play no role in this problem.
If you're asking about a DML statement, such as UPDATE, the CREATE TABLE and INSERT statements should re-create the tables as they are before the DML, and the results will be the contents of the changed table(s) when everything is finished.
Always say which version of Oracle you're using.
See the forum FAQ {message:id=9360002}
Maybe you are looking for
-
Gmail Account in iMail - adding multiple exchange SMTP addresses to Gmail
Summary: I am trying to use my Gmail to send messages through iMail from my other addresses that I have added to my Gmail account successfully. Detail: I currently have 5 email addresses, and the most recent one I created was my Gmail address. Ever
-
How to Remove Premium Channels Like HBO or Cinemax
I wanted to document this because nobody should have to go through the hoops I just had to. Sadly, I'm sure others have gone through much more. Follow these steps to remove channels you no longer want to pay for, or avoid paying for because their f
-
How to use RESTFUL web services in SMP 3.0 Appbuilder?
Hi All, I want to develop an application using RESTfull service. I have already developed REST service,I want to use that service in Appbuilder Application for SMP3.0. How can I call the REST services into our SMP 3.0 Appbuilder application? If
-
Used macbook pro won't forget original apple id
Help! this is so frustrating. I bought a used Macbook Pro from Best Buy. Unfortunately, every once in a while when I need to update an app or program, it'll suggest the previous owners apple ID and it won't let me overwrite it. I took it back to Best
-
How to set components aligned in left when we use BorderLayout
Hello All, How to set the components aligned in the left when we use BorderLayout in a panel.Right now,the components are getting aligned in the center. Any solutions? Thanks in advance, Vijay