Auto mapping target fields from source in informatica - etl

I hav a source structure in informatica like
col1 number col2 varchar(40) col3 DATE col4 varchar(50) col5 number
and my target definition is like
col4 varchar(50) col1 number col5 number col3 varchar(40) col3 DATE
If i want to load the source records into target i will map the columns appropriately from source to target in a zig zag way
I just want to know that if there is any concept like informatica will automap fields from source to target based on column names i.e if the target columns are shuffled but the column names are the same ...
any suggestions regarding the same would be helpful ..

PowerCenter can automatically link ports between transformations both by position and by name.
You should use the latter:
click Layout > Autolink by Name,
select the mapping object that you want to link (e.g. source) and drag the selected ports to another mapping object (e.g. target).

Related

Unable to see stored procedure columns in Data Source Config wizard

I am working on configuring an RDLC for a project in Visual Studio. To the related stored procedure I added 3 columns. Now, while configuring the Dataset to include the new columns, I am not able to see any of the output columns for the selected stored procedure.
My test procedure:
CREATE proc test
#Center_ID TINYINT = NULL
AS
SET NOCOUNT ON
CREATE TABLE #test_tbl
(
col1 VARCHAR(20),
col2 VARCHAR(20)
)
INSERT INTO #test_tbl
VALUES ('COL1', 'COL2')
SELECT
col1, col2
FROM
#test_tbl
Now, in Visual Studio, I am not seeing the col1 and col2 check boxes in the Data source config wizard:
How do I make the columns show up in the wizard?!
Thanks!

Virtual Column Issue with Oracle Forms

I have an Interface which's created with Oracle Forms. It has a base table block in which there's a field (namely col3"has the same name with the table's column that's derived from").
Form has two other fields col1 and col2 as of numeric type, and those fields are also members of the same table having col3 column mentioned above.
I converted col3 to a virtual column as the sum of the columns col1 and col2 in the table's definition( col3 number generated always as (nvl(col1,0)+nvl(col2,0)) virtual )
When I try to commit the changes in the base table it hurls the error message
ORA-54013: INSERT operation disallowed on virtual columns
I know applying a DML to a virtual column has no sense, but even I changed the col3 field's
Query Only property from No to Yes
Update Allowed property from Yes to No
Insert Allowed property from Yes to No
I get the same error message. I don't want to write explicit DML statements, since the form has lots of other fields, and they should also be listed in those statements.
Do you have any idea how I can overcome this problem without giving up base table block structure ? ( I'm using the version Fusion Middleware 11g )
As everything you do with that column is query, how about setting it to be a non-database column? It would require writing a POST-QUERY trigger, though - otherwise you wouldn't see its value after executing a query.
:block.col3 := :block.col1 + :block.col2;
Put the same code into WHEN-VALIDATE-ITEM triggers on both :block.col1 and :block.col2 items, so that you'd calculate the result when inserting/updating values.
Alternatively, create a procedure (within the form), put the above code into it, and then call the procedure from those triggers - for a long term, that's probably a better choice as you'd have to maintain code changes only in the procedure.

Oracle - Change Table Position [duplicate]

I have a specific scenario where i have to insert two new columns in an existing table in Oracle. I can not do the dropping and recreating the table. So can it be achieved by any means??
Amit-
I don't believe you can add a column anywhere but at the end of the table once the table is created. One solution might be to try this:
CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;
Drop the table you want to add columns to:
DROP TABLE TABLE_TO_CHANGE;
It's at the point you could rebuild the existing table from scratch adding in the columns where you wish.
Let's assume for this exercise you want to add the columns named "COL2 and COL3".
Now insert the data back into the new table:
INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4)
SELECT COL1, 'Foo', 'Bar', COL4
FROM MY_TEMP_TABLE;
When the data is inserted into your "new-old" table, you can drop the temp table.
DROP TABLE MY_TEMP_TABLE;
This is often what I do when I want to add columns in a specific location. Obviously if this is a production on-line system, then it's probably not practical, but just one potential idea.
-CJ
In 12c you can make use of the fact that columns which are set from invisible to visible are displayed as the last column of the table:
Tips and Tricks: Invisible Columns in Oracle Database 12c
Maybe that is the 'trick' #jeffrey-kemp was talking about in his comment, but the link there does not work anymore.
Example:
ALTER TABLE my_tab ADD (col_3 NUMBER(10));
ALTER TABLE my_tab MODIFY (
col_1 invisible,
col_2 invisible
);
ALTER TABLE my_tab MODIFY (
col_1 visible,
col_2 visible
);
Now col_3 would be displayed first in a SELECT * FROM my_tab statement.
Note: This does not change the physical order of the columns on disk, but in most cases that is not what you want to do anyway. If you really want to change the physical order, you can use the DBMS_REDEFINITION package.
Although this is somewhat old I would like to add a slightly improved version that really changes column order. Here are the steps (assuming we have a table TAB1 with columns COL1, COL2, COL3):
Add new column to table TAB1:
alter table TAB1 add (NEW_COL number);
"Copy" table to temp name while changing the column order AND rename the new column:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
drop existing table:
drop table TAB1;
rename temp tablename to just dropped tablename:
rename tempTAB1 to TAB1;
You (still) can not choose the position of the column using ALTER TABLE: it can only be added to the end of the table. You can obviously select the columns in any order you want, so unless you are using SELECT * FROM column order shouldn't be a big deal.
If you really must have them in a particular order and you can't drop and recreate the table, then you might be able to drop and recreate columns instead:-
First copy the table
CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;
Then drop columns that you want to be after the column you will insert
ALTER TABLE my_tab DROP COLUMN three;
Now add the new column (two in this example) and the ones you removed.
ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10));
Lastly add back the data for the re-created columns
UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);
Obviously your update will most likely be more complex and you'll have to handle indexes and constraints and won't be able to use this in some cases (LOB columns etc). Plus this is a pretty hideous way to do this - but the table will always exist and you'll end up with the columns in a order you want. But does column order really matter that much?

Hive solution to select/treat null string as NULL

I have a Hive external table with csv data in it. Some of the string fields have value as 'null'. Now, I want to select the data and insert into other table in ORC format with query like 'select * from first insert into second'.
I want to replace the string 'null' with actual NULL value.
One solutions could be replace 'null' with blank and design my table to treat blank as null. That may work. But, if there are any blank values present in data, those will be also treated as NULL.
Other point comes to my mind is, the table has large number of columns with such strings.So if the solution requires to select a column and perform some operation; I will have to write a very long query. But if there is no other option, that can be done.
Please suggest a solution.
All you need to do is to alter your external table so it will treat null string as NULL
alter table my_external_table set tblproperties('serialization.null.format'='null');
The more recent versions of Hive support the standard NULLIF() function. If you are using insert, then you should be listing the columns anyway:
insert into second(col1, col2, col3, . . .)
select col1, nullif(col2, 'null'), col3, . . .
from first;

Field autoincrement for Oracle without trigger with Slick?

I am trying to insert rows in a ErrorTable which has a few fields plus an idError which is supossed to be the primary key. I need idError to be autoincremented. However one requirement is we cannot use a trigger, so using O.AutoInc would not work for us.
We also tried to use plain sql using a sequence. However we have two blob fields which makes the query too long ( getting the string literal too long error).
Any idea about how to attack this problem? I am also considering to use UUID.
Note: we are using oracle-xe-11g
In 11g you can have only implement an auto-incrementing identifier with a trigger. So it seems your requirements rule out anything except SYS_GUID. Find out more.
" it also represents another query to get that value "
Not necessarily. If you have the option to define the target table you can set a default values for the UUID column like this:
create table t23 (
id raw(16) default sys_guid() not null primary key
, col1 varchar2(10)
);
Then
SQL> insert into t23 (col1) values ('ABC');
1 row created.
SQL> select * from t23;
ID COL1
-------------------------------- -----------
7DD7216E731C126537615FE1244B4B50 ABC
SQL>
Note: tested on 12C but should work in earlier versions.

Resources