Trying to import Datapump dump into remote Oracle Server via SQL - sql

I am trying to import a datapump dump file into a remote server via SQLPlus.
So, local machine -> remote oracle Server
Dump file is on local machine on a SMB share.
I have written a little script for that operation, however it fails with errors.
The Datapump Directory exists (SMB share on local machine, DIRECTORY is pointing to said share)
My script:
DECLARE
ind NUMBER; -- Loop index
h1 NUMBER; -- Data Pump job handle
percent_done NUMBER; -- Percentage of job complete
logfileName VARCHAR2(30);-- Name of the Logfile
job_state VARCHAR2(30); -- To keep track of job state
le ku$_LogEntry; -- For WIP and error messages
js ku$_JobStatus; -- The job status from get_status
jd ku$_JobDesc; -- The job description from get_status
sts ku$_Status; -- The status object returned by get_status
BEGIN
h1 := DBMS_DATAPUMP.OPEN('IMPORT','FULL',NULL,'IMPORT_XYDESCRIPTOR');
DBMS_DATAPUMP.ADD_FILE(h1,'dump.dmp','DPIMP_REMOTE',NULL,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE,1);
DBMS_DATAPUMP.SET_PARAMETER(h1,'TABLE_EXISTS_ACTION','APPEND');
DBMS_DATAPUMP.START_JOB(h1);
[... more stuff...]
However I get the following error, when I execute that script as SYSDBA:
DECLARE
*
ERROR at line 1:
ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4056
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4307
ORA-06512: at line 15
line 15 is this line:
DBMS_DATAPUMP.ADD_FILE(h1,'dump.dmp','DPIMP_REMOTE',NULL,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE,1);
I don't really get why I get an invalid argument value error, the command is exactly as the Oracle wiki dictates.
Can someone help me on what I am doing wrong?
Maybe the thing I try isn't even possible?

Related

PLSQL UTL FILE IS NOT GETTING CREATED ANY Solution

Hi guys IP am trying to use the utl_file package in PLSQL...
I have granted the user to create directory privilege and read and write privilege from sysdba...when I create a directory it says "directory created", but is physical harddrive local location no directory is created.
When I write a code to give output in file it gives some errors.
Code:
SQL> create or replace directory PLSQL as 'D:\PLSQL';
Directory created.
SQL>declare
2 fp utl_file.file_type;
3 begin
4 fp := utl_file.fopen('D:\PLSQL', 'Hello.txt','w');
5 utl_file.putf(fp,'HI THIS IS WRITTEN IN SQLPLUS');
6 utl_file.fclose(fp);
7 end;
8 /
declare
*
ERROR at line 1:
ORA-29280: invalid directory object
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at line 4
if any solution help...
Two objections so far:
when you create a directory (an Oracle object), nothing is "automatically" created in filesystem. That directory (D:\PLSQL) has to exist, you have to create it manually (using e.g. Windows Explorer or Command Prompt or ...).
Note that directory usually resides on a database server. If D:\PLSQL is located on your own PC (while the database is elsewhere), it won't work. If you can't access the database server (because of lack of privileges), you'll have to talk to DBA to do it for you. Though, saying that you connected as sysdba, I presume that it shouldn't be a problem for you.
when referencing the directory in PL/SQL code, you have to use its name (PLSQL), not its path (D:\PLSQL):
fp := utl_file.fopen('PLSQL', 'Hello.txt','w');
I tested your code, works just fine (file is created in my directory).
1st create a logical directory using below syntax:
create directory logfile as 'D:\PLSQL';
and then refer the same in your code. Also please be sure you have read, write grant on this new logical directory.
GRANT READ,WRITE ON DIRECTORY logfile TO user_Name;
declare
2 fp utl_file.file_type;
3 begin
4 fp := utl_file.fopen(logfile , 'Hello.txt','w');
5 utl_file.putf(fp,'HI THIS IS WRITTEN IN SQLPLUS');
6 utl_file.fclose(fp);
7 end;
8 /

How to write a txt file on desktop using SQL script in Toad

I'm trying to write a simple txt file using SQL in Toad. Below is the SQL
create or replace directory dir_temp as 'C:\Users\name\Desktop\';
declare
f utl_file.file_type;
begin
f := utl_file.fopen('DIR_TEMP', 'something.txt', 'w');
utl_file.fclose(f);
end;
/
This results into error:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 4
I've verified the grants for Oracle user on directory. It has all permissions.
Also, I'm able to create spool file in the same directory.
Directory should be created by SYS, and has to be located on the database server (OK, it can be elsewhere, but it usually isn't). If database isn't installed on your own computer but on some database server, then directory object points to a directory on the server, not your own PC.
If you do it properly, it works. I use 11gXE, installed on my laptop. Here's how:
Connected as SYS, I'm creating a directory and granting privileges to user (SCOTT) who will use it.
SQL> show user
USER is "SYS"
SQL> create or replace directory dir_temp as 'c:\users\littlefoot\desktop';
Directory created.
SQL> grant read, write on directory dir_temp to scott;
Grant succeeded.
Connect as Scott; reuse code you wrote:
SQL> connect scott/tiger
Connected.
SQL> declare
2 f utl_file.file_type;
3 begin
4 f := utl_file.fopen('DIR_TEMP', 'something.txt', 'w');
5 utl_file.fclose(f);
6 end;
7 /
PL/SQL procedure successfully completed.
Looks OK. Check whether the file was created:
SQL> $dir c:\users\littlefoot\desktop\*.txt
Volume in drive C is OSDisk
Volume Serial Number is 7635-F892
Directory of c:\users\littlefoot\desktop
05.03.2020. 19:25 0 something.txt
1 File(s) 0 bytes
0 Dir(s) 290.609.057.792 bytes free
SQL>
Right; the file is here (empty, though, but - it exists).
So, if you do it right, it works.

Error while changing port for oracle XE 11g

I am trying to change port of oracle xe 11g, as I am not able to open the link using default port 8080. I am getting below error.
SQL> Exec DBMS_XDB.SETHTTPPORT(3010);
BEGIN DBMS_XDB.SETHTTPPORT(3010); END;
*
ERROR at line 1:
ORA-31024: Parser initialization failed with LPX-54 error
while parsing a stream to XOB
ORA-06512: at "XDB.DBMS_XDB", line 516
ORA-06512: at "XDB.DBMS_XDB", line 645
ORA-06512: at line 1
Please help.
You should have run it connected as SYS or SYSTEM.

reading and writing text files using UTL_FILE package remotely

I 'am trying to read and write files using utl_file package remotely but the oracle server cant read and write on other pc ,so i make a shared path on '\\adel-pc\test', and i want to read and write on that path but i get this error when reading :
SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8
java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8
and this error when writing :
SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
and this is my code :
CREATE OR REPLACE DIRECTORY utl_test AS '\\10.10.60.11\test';
-- reading the file
DECLARE
p_dir varchar2(2000):='UTL_TEST';
p_file_name varchar2(2000):='IFD18021801IFEEDTL'; --file name
l_file UTL_FILE.file_type;
l_text varchar2(32767);
begin
l_file := UTL_FILE.fopen(p_dir,p_file_name,'r');
LOOP
UTL_FILE.get_line(l_file,l_text);
DBMS_OUTPUT.put_line(l_text);
END LOOP;
UTL_FILE.fclose(l_file);
EXCEPTION
WHEN UTL_FILE.invalid_operation THEN dbms_output.PUT_LINE('cannot open file invalid name');
WHEN UTL_FILE.read_error THEN dbms_output.PUT_LINE('cannot be read');
WHEN no_data_found THEN dbms_output.PUT_LINE('end of file');
UTL_FILE.fclose(l_file);
END;
--writing the file
declare
l_file UTL_FILE.file_type;
l_location varchar2(100) := 'UTL_TEST'; -- capital latter
l_filename varchar2(100) := 'am';
begin
l_file := UTL_FILE.fopen(l_location,l_filename,'w');
FOR i IN (SELECT * FROM hr.EMPLOYEES)
LOOP
UTL_FILE.PUT_LINE(l_file,i.EMPLOYEE_ID||' '||i.FIRST_NAME);
END LOOP;
UTL_FILE.fclose(l_file);
l_file := UTL_FILE.fopen(l_location,l_filename,'A');
UTL_FILE.PUT_LINE(l_file,'Additonal lines');
UTL_FILE.fclose(l_file);
END;
so my questions are:
could I write and read on the shared path or it cant be done using utl_file ?
why I am getting this error , knowing that I gave read & write permissions to that path.
I'd suggest you not to do it that way.
First of all, you're creating that procedure in SYS schema, which is - generally speaking - a bad idea. Leave SYS (and SYSTEM) alone; create your own user, grant it required privileges (CREATE SESSION, CREATE PROCEDURE and any other you might require), connect to it and then write code you want.
Why are you creating directories dynamically? That is a one-time job and should be done once, connected as SYS. Although you might have created those directories (it is a good idea to first DBMS_OUTPUT.PUT_LINE command you're about to execute, make sure it is correctly written and then actually run it), you did not grant READ nor WRITE privileges on them to anyone, so - nobody can use them but SYS and - as I've said above - don't use SYS for that.
Note that I'm not talking about operating system privileges, but Oracle ones, e.g.
grant read, write on directory some_dir to scott;
Finally, as of creating a directory on a computer that is not the database server: you should use UNC (Universal Naming Convention) and create a directory literally as \\adel-pc\test; it won't work if you map that directory on the server and use its drive letter.
As of the error itself, huh ... you posted several hundreds lines of code, it is little bit too much to debug just by looking at it, and we miss other objects you use. No idea, sorry.
finally the problem is solved ,the problem was in windows system privileges , I had to give full control permissions to the files ,so yes i can write and read on the shared path using utl_file .

Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI

I have a Perl program that we have run successfully every day for almost the past 2 years, but which crashes today with the error message:
FATAL ERR: Can't do PRAGMA cache_size = 1000000: attempt to write a readonly database
The SQLite database in question is readonly, and always has been, and the code has always used PRAGMA cache_size = 1000000 on it immediately after opening its readonly connection.
Setting cache_size is not a write operation, and does not fail if I access the db directly thru the DBI, like this:
$dbh->do("PRAGMA cache_size = 1000000")
However, the code makes SqliteH::db a subclass of DBI::db, then calls this function from the subclass:
$self->SUPER::do("PRAGMA cache_size = 1000000")
and it now dies with "DBD::SQLite::db do failed: attempt to write a readonly database at /local/ifs_projects/prok/function/src/lib/SqliteH.pm line 329."
The code worked with CentOS 5, Perl 5.10.1, DBD::SQLite 1.29, and DBI 1.611.
It does not work CentOS 6, Perl 5.16, DBD::SQLite 1.39, and DBI 1.627.
I am however mystified that it /did/ work last week on CentOS 6 and Perl 5.16. IT may have upgraded DBD::SQLite or DBI over the weekend.
Please do not change the title to "Suddenly getting error on program that has worked for months" again. That is an unhelpful and nonspecific title.
TL;DR - if transactions are on, then any command attempts to write to the transaction log. Remove AutoCommit=>0 from the dbh connection flags if the database is read-only [You shouldn't have any ->begin_work() or INSERT/UPDATE calls either, but that never worked on a read-only db :-) ].
As it turns out, I had exactly the same problem today after updating SQLite, DBI and DBD::SQLite (so I don't know exactly which of them caused the problem), but in my case, on a select (which made it even more baffling).
It turned out that transactions were turned on in the original connect string:
my $dbh=DBI->connect('dbi:SQLite:file.db','','',, {PrintError=>1,RaiseError=>1,AutoCommit=>0});
and, after tracing the code, I noticed that it was actually crashing trying to start a transaction.
DB<4> $dbh->trace(15)
DBI::db=HASH(0x18b9c38) trace level set to 0x0/15 (DBI # 0x0/0) in DBI 1.627-ithread (pid 15740)
DB<5> $sth= $dbh->prepare("SELECT key,value FROM annotation where accession=?")
...
DB<6> $sth->execute('D3FET3')
-> execute for DBD::SQLite::st (DBI::st=HASH(0x18ba340)~0x18ba178 'D3FET3') thr#10cd010
sqlite trace: bind into 0x18ba268: 1 => D3FET3 (0) pos 0 at dbdimp.c line 1232
sqlite trace: executing SELECT key,value FROM annotation where accession=? at dbdimp.c line 660
sqlite trace: bind 0 type 3 as D3FET3 at dbdimp.c line 677
sqlite trace: BEGIN TRAN at dbdimp.c line 774
sqlite error 8 recorded: attempt to write a readonly database at dbdimp.c line 79
!! ERROR: '8' 'attempt to write a readonly database' (err#1)
<- execute= ( undef ) [1 items] at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2 via at -e line 1
DBD::SQLite::st execute failed: attempt to write a readonly database at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2.
...
Removing the AutoCommit=>0 flag in the connect() call fixed my problem.