SQL Server - Date of newly inserted column in a table - oracle

As part of my project, new columns are introduced in many tables. I wanted to find out the date in which this columns are introduced. Is there a way I can query the date of insertion of all the columns in a specific table in Oracle SQL Developer 3.0.04.

You can try to use the last_ddl_time object from the dba_objects table.

Related

Retrieve from dynamically named tables

I'm using Talend Open Studio for Data Integration.
I have tables that are generated every day and table names are suffixed by date like so
dailystats20220127
dailystats20220126
dailystats20220125
dailystats20220124
I have two-part question.
I want to look at the table which has yesterday's date in it so sysdate - 1 and I want to fetch data from yesterday
select 'dailystats' ||to_char(sysdate - 1,'YYYYMMDD') TableName
from dual;
How do I retrieve schema for a dynamic name?
How do I pull data from that table.
I've worked with static table names and its a straightforward process.
If the schema is always the same, you just define it once in your input component.
In your input component set the sql as :
"select [fields] from dailystats"+ TalendDate.formatDate("yyyyMMdd", TalendDate.addDate(TalendDate.getCurrentDate(), -1, "dd"))

Take a snapshot for a table in oracle

I have a table called "col" - This table is updated every month.
what i want is to take snapshot (updated version) for that table every period of time.
my question is how to take snapshot for that table in oracle ?
EDIT: my DB version is 19c
The easiest way is to just run a "CTAS" aka "CREATE TABLE [your table name plus some date string] AS SELECT * FROM [the table];
CREATE TABLE [SNAPSHOT NAME] as SELECT * FROM [TABLE NAME];
Note: this works a lot of places, not just in Oracle.
Create the SNAPSHOT TABLE with an identical structure as the original column with an additional column SNAPSHOT_DATE
Example
CREATE TABLE COL_SNAPSHOT AS
SELECT
cast (null as DATE) as SNAPSHOT_DATE,
a.*
from COL a
WHERE 1=0;
THis statement creates an e,pty table with the additional column. You may partition the table an the column SNAPSHOT_DATEif you are lincenced for it.
Now once a month you take a new snapshot using following insert
INSERT INTO COL_SNAPSHOT
(SNAPSHOT_DATE, ... all columns from COL ...)
SELECT
sysdate SNAPSHOT_DATE, ... all columns from COL ...
FROM COL;
You save the current state of the table and additionaly in the column SNAPSHOT_DATE is the timestamp of the snapshot.

Adding a sequence to a large Oracle table

I have queries that take an existing large table and build tables off of them for reporting. The problem is that the source tables are 60-80MM+ records and it takes a long time to recreate. I'd like to be able to identify which records are new so I can build just add the new records to the reporting tables.
To me, the best way to identify this is to have an identity column. Is there any significant cost to creating this and adding it to the table?
Separately, is it possible to create a materialized view that takes data from one of these tables but add a sequence as part of the materialized view? That is, something like
create materialized view some_materialized_view as
select somesequence.nextval, source_table.*
from source_table?
You can add a sequence based column to your table, but as Gary suggests I wouldn't do that.
The task you are about to solve is so common that other solutions have been already implemented.
The first built-in option that comes to mind is the system change number SCN, a kind of Oracle internal clock. By default, tables are set up to record the SCN of the whole (usually 8K) block, containing usually many rows, but you can set a table to keep a record of the SCN that changed every row. Then you can track the columns that are new or change and have not been copied to your reporting tables.
CREATE TABLE t (c1 NUMBER) ROWDEPENDENCIES;
INSERT INTO t VALUES (1);
COMMIT;
SELECT c1, ora_rowscn FROM t;
Secondly, I would think of adding a date column. With 60-80 mio rows I wouldn't do this with ALTER TABLE xxx ADD (d DATE DEFAULT SYSDATE), but with rename, create as select, drop:
CREATE TABLE t AS SELECT * FROM all_objects;
RENAME t TO told;
CREATE TABLE t AS SELECT sysdate AS d, told.* FROM told;
ALTER TABLE t MODIFY d DATE DEFAULT SYSDATE;
DROP TABLE told;
Thirdly, I would read up on materialized views. I never had the chance to use this a work, but in theory, you should be able to set up a materialized view log on your 80 m table that records changes and updates dependent materialized views.
And forthly, I'd look into partitioning your large table on the (newly introduced) date column, so that identifying the new rows will become faster. That sadly depends on your version and Oracle license, though.

how to fetch last access TIMESTAMP of a table in oracle?

How to fetch the last access date for a table in oracle using the query from Oracle DB?
I am using select TIMESTAMP from dba_tab_modifications query it's giving me last updates in table
but I need last execution of select query statement on a particular table
Thanks in Advance
Sai Kumar
Oracle does not keep this information by default. You need to enable the appropriate AUDIT rules. But I'd question what problem you think this will solve. Auditing every access to a table will be a lot of audit records.

Updating a SQL table where items to change are identified in another table that is linked

Everywhere I look I can find how to update a table from data in another table but I am not looking for that. I have two tables TABLE1 and TABLE2. TABLE1 has a column PULLDATE and a column JOBNMBR. TABLE2 has a column JOBNMBR and a column PROJECT. The two tables link at the JOBNMBR column. I need to do a bulk update to TABLE1.PULLDATE per a project number, but that project number is stored in TABLE2.PROJECT.
Using VisualStudio 2005 and in VB code not C+, does anyone know the code (if there is any) that links the tables and allows me to update all TABLE1.PULLDATE records grouped by TABLE2.PROJECT? I will be providing the trigger to update using a textbox [TxtBox_Pulldate] and a nearby button [Button_UpdatePulldate].
Thanks a bunch
Chuck Vensel
I think I understand that you want to update Table1 given a matching column in Table2?
You write the SQL update just as you would the SELECT except replace the SELECT clause with the UPDATE clause.
UPDATE Table1
SET
[PULLDATE] = your_value
FROM
Table1
JOIN Table2
ON Table2.[JOBNMBR] = Table1.[JOBNMBR]
WHERE
Table2.[PROJECT] = your_project_ID

Resources