Postgresql pg_profile getting error while creating snapshot - postgresql

I am referring https://github.com/zubkov-andrei/pg_profile for generating awr like report.
Steps which I have followed are as below :
1) Enabled below parameters inside postgresql.conf (located inside D:\Program Files\PostgreSQL\9.6\data)
track_activities = on
track_counts = on
track_io_timing = on
track_functions = on
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 1000
pg_stat_statements.track = 'top'
pg_stat_statements.save = off
pg_profile.topn = 20
pg_profile.retention = 7
2) Manually copied all the file beginning with pg_profile to D:\Program Files\PostgreSQL\9.6\share\extension
3) From pgAdmin4 console executed below commands successfully
CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_profile;
4) To see which node is already present I executed SELECT * from node_show();
which resulted in
node_name as local
connstr as dbname=postgres port=5432
enabled as true
5) To create a snapshot I executed SELECT * from snapshot('local');
but getting below error
ERROR: could not establish connection
DETAIL: fe_sendauth: no password supplied
CONTEXT: SQL statement "SELECT dblink_connect('node_connection',node_connstr)"
PL/pgSQL function snapshot(integer) line 38 at PERFORM
PL/pgSQL function snapshot(name) line 9 at RETURN
SQL state: 08001
Once I am able to generate multiple snapshot then I guess I should be able to generate report.

just use SELECT * from snapshot()
look at the code of the function. It calls the other one with node as parameter.

Related

How create Oracle procedure witch select with dblink from postgres

I can select(in Oracle) from postgers with dblink, and its work fine.
But if i create procedure with this select:
Procedure:
`CREATE OR REPLACE PROCEDURE test_merge as
begin
MERGE INTO CARDS C
USING (SELECT c."card_id", 1, n."channel"
FROM "table_1"#DBLINK_NAME n
JOIN
"table_2"#DBLINK_NAME c
ON n."card_id" = c."id"
WHERE n."type" = 'param1') B
ON (C.CARDID = B."card_id")
WHEN MATCHED
THEN
UPDATE SET C.SENDR = 1, C.PHONE = '+' || B."channel";
end;`
ORA-04052: error occurred when looking up remote object postgres.table_name#DBLINK_NAME ORA-00604: error occurred at recursive SQL level 1 ORA-28500: connection from ORACLE to a non-Oracle system return this message: ERROR: relation "postgres.card" does
Have any idea?
Oracle 11g
Thanks!
It was necessary to specify the owner of the database on postgre. In my case, it was enough to specify "public". in the procedure. before accessing tables.
"public"."table_1"#DBLINK_NAME

creating sql function implemented in java via flyway

I'm trying to create a function like:
--#SET TERMINATOR #
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
#
from flyway. The jar file is already installed on the server, and I can create the function without problems via clp:
~]$ db2 -v -td# -f aa.sql
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
DB20000I The SQL command completed successfully.
I also tried creating via dbeaver from my local machine without a problem:
Updated Rows 0
Query CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
Finish time Tue Jan 11 22:14:46 CET 2022
But if I try to run the same file from flyway:
]$ flyway -schemas=NYA_FLYWAY -table="FLYWAY_SCHEMA_HISTORY" -driver=${driver} -url=jdbc:db2://${host}:${port}/${db} -user=${username} -password=${passwd} -jarDirs=${jarDirs} -locations="filesystem:${upgradedir}" migrate
A new version of Flyway is available
Upgrade to Flyway 8.4.1: https://rd.gt/2X0gakb
Flyway Community Edition 8.0.5 by Redgate
Database: jdbc:db2://130.239.91.21:50000/NYA (DB2/LINUXX8664 11.5)
Successfully validated 36 migrations (execution time 00:00.027s)
Current version of schema "NYA_FLYWAY": 22.223.100.3
Migrating schema "NYA_FLYWAY" to version "22.223.100.4"
ERROR: Migration of schema "NYA_FLYWAY" to version "22.223.100.4" failed! Changes successfully rolled back.
ERROR: Migration V22.223.100.4__.sql failed
------------------------------------
SQL State : 46008
Error Code : -20204
Message : The user defined function or procedure "NYA.QUINT_2_UINT" was unable to map to a single Java method.. SQLCODE=-20204, SQLSTATE=46008, DRIVER=4.29.24
Location : /home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration/V22.223.100/V22.223.100.4__.sql (/home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration/V22.223.100/V22.223.100.4__.sql)
Line : 3
Statement : CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
Caused by: Migration V22.223.100.4__.sql failed
------------------------------------
SQL State : 46008
Error Code : -20204
Message : The user defined function or procedure "NYA.QUINT_2_UINT" was unable to map to a single Java method.. SQLCODE=-20204, SQLSTATE=46008, DRIVER=4.29.24
Location : /home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration/V22.223.100/V22.223.100.4__.sql (/home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration/V22.223.100/V22.223.100.4__.sql)
Line : 3
Statement : CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
Caused by: com.ibm.db2.jcc.am.SqlException: The user defined function or procedure "NYA.QUINT_2_UINT" was unable to map to a single Java method.. SQLCODE=-20204, SQLSTATE=46008, DRIVER=4.29.24
I'm using the same driver with dbeaver and flyway. I also tried running it from gradle with the same error. Any clue on what might cause this issue with flyway?
There are other functions in the jar as well and all that I have tried, share the same problem as described above
FWIW, the underlying function is A Proposal for Proquints: Identifiers that are Readable, Spellable, and Pronounceable
EDIT:
The jar file is normally installed in a similar fashion as Mark demonstrated in calling-sqlj-install-jar-from-jdbc using gradle.
But to eliminate any errors there, I manually installed the jarfile on the server as:
[db2inst1#nya-01 ~]$ db2 "call sqlj.install_jar('file:///opt/nya/users/db2inst1/STRINGUTIL.jar', 'STRINGUTIL')"
SQL20201N The install, replace or remove of "DB2INST1.STRINGUTIL" failed as
the jar name is invalid. SQLSTATE=46002
[db2inst1#nya-01 ~]$ db2 "call sqlj.replace_jar('file:///opt/nya/users/db2inst1/STRINGUTIL.jar', 'STRINGUTIL')"
DB20000I The CALL command completed successfully.
[db2inst1#nya-01 ~]$ db2 "call sqlj.refresh_classes()"
DB20000I The CALL command completed successfully.
Now, on the server I can:
[db2inst1#nya-01 ~]$ db2 connect
Database Connection Information
Database server = DB2/LINUXX8664 11.5.6.0
SQL authorization ID = DB2INST1
Local database alias = EKLN_N11
[db2inst1#nya-01 ~]$ db2 -v -td# -f aa.sql
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
DB20000I The SQL command completed successfully.
db2 "VALUES NYA.QUINT_2_UINT('aabbccddee')"
1
-----------
17
1 record(s) selected.
Using dbeaver from my workstation, against the same server/database, also works fine (so jdbc does not seem to be a problem per se):
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION
#
VALUES NYA.QUINT_2_UINT('ddeeaabbccd') #
1 |
-------+
1114113|
But if I try to run it from flyway on my workstation against the same server/database I get the error:
SQL State : 46008
Error Code : -20204
Message : The user defined function or procedure "NYA.QUINT_2_UINT" was unable to map to a single Java method.. SQLCODE=-20204, SQLSTATE=46008, DRIVER=4.29.24
The java code itself is not very exciting:
package se.uhr.nya.commons.db.procedures;
public class Proquint {
...
static int quint2uint(String quint) {
long res = 0;
for (char c : quint.toCharArray()) {
int index = indexOf(uint2consonant, c);
if (index != -1) {
res <<= 4;
res += index;
} else {
index = indexOf(uint2vowel, c);
if (index != -1) {
res <<= 2;
res += index;
}
}
}
return (int) res;
}
I used the same user/passwd for all 3 cases (clp, dbeaver. flyway)
EDIT2:
I did a small test program:
import java.sql.*;
public class tst {
public static void main(String [] args) {
String urlPrefix = "jdbc:db2:";
String url;
String user;
String password;
String dummy;
Connection con;
Statement stmt;
ResultSet rs;
System. out.println ("**** Enter class tst" );
if (args.length !=3)
{
System. err.println ("Invalid value. First argument appended to " +
"jdbc:db2: must specify a valid URL." );
System. err.println ("Second argument must be a valid user ID." );
System. err.println ("Third argument must be the password for the user ID.");
System. exit(1);
}
url = urlPrefix + args[0];
user = args[1];
password = args[2];
try {
Class. forName("com.ibm.db2.jcc.DB2Driver");
System. out.println("**** Loaded the JDBC driver" );
con = DriverManager. getConnection(url, user, password);
con.setAutoCommit( false);
System. out.println("**** Created a JDBC connection to the data source");
stmt = con.createStatement();
System. out.println("**** Created JDBC Statement object" );
String s = "CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) ";
s += "RETURNS INTEGER ";
s += "RETURNS NULL ON NULL INPUT ";
s += "FENCED THREADSAFE ";
s += "DETERMINISTIC ";
s += "NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA ";
s += "EXTERNAL NAME 'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' ";
s += "NO EXTERNAL ACTION";
//stmt.executeUpdate(s);
stmt.execute(s);
System. out.println("**** Created function" );
s = "values NYA.QUINT_2_UINT('aabbccddeeg')";
rs = stmt.executeQuery(s);
while (rs.next()) {
dummy = rs.getString(1);
System. out.println("number = " + dummy);
}
System. out.println("**** Fetched all rows from JDBC ResultSet" );
rs.close();
System. out.println("**** Closed JDBC ResultSet" );
// Close the Statement
stmt.close();
System. out.println("**** Closed JDBC Statement" );
// Connection must be on a unit-of-work boundary to allow close
con.commit();
System. out.println ( "**** Transaction committed" );
con.close();
System. out.println("**** Disconnected from data source" );
System. out.println("**** JDBC Exit from class tst - no errors" );
}
catch(ClassNotFoundException e) {
System. err.println("Could not load JDBC driver" );
System. out.println("Exception: " + e);
e.printStackTrace();
}
catch(SQLException ex) {
System. err.println("SQLException information" );
while(ex!=null ) {
System. err.println ("Error msg: " + ex.getMessage());
System. err.println ("SQLSTATE: " + ex.getSQLState());
System. err.println ("Error code: " + ex.getErrorCode());
ex.printStackTrace();
ex = ex.getNextException(); // For drivers that support chained exceptions
}
}
}
}
and compared the jdbc trace for that with a jdbc trace for flyway. The flyway trace looks like:
[jcc][Time:2022-01-13-12:22:49.714][Thread:main][Statement#275fe372]setEscapeProcessing (false) called
[jcc][Thread:main][SystemMonitor:start]
[jcc][Time:2022-01-13-12:22:49.714][Thread:main][Statement#275fe372]execute (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'STRINGUTIL:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
[jcc][Time:2022-01-13-12:22:49.714][Thread:main][Statement#275fe372]stmt_bidiTransform (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'STRINGUTIL:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
[jcc][Time:2022-01-13-12:22:49.714][Thread:main][Statement#275fe372]stmt_bidiTransform not enabled (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'STRINGUTIL:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
[jcc][t4][time:2022-01-13-12:22:49.714][Thread:main][tracepoint:1][Request.flush]
whereas the test program:
[jcc][Thread:main][SystemMonitor:start]
[jcc][Time:2022-01-13-12:22:28.089][Thread:main][Statement#1372ed45]execute (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
[jcc][Time:2022-01-13-12:22:28.089][Thread:main][Statement#1372ed45]stmt_bidiTransform (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
[jcc][Time:2022-01-13-12:22:28.089][Thread:main][Statement#1372ed45]stmt_bidiTransform not enabled (CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION) called
>>> [jcc][t4] [time:2022-01-13-12:22:28.089][Thread:main]
>>> [tracepoint:10]SetClientPiggybackCommand: flowToServerNeeded() = true
>>> [jcc][t4] [time:2022-01-13-12:22:28.089][Thread:main]
>>> [tracepoint:10]SetClientPiggybackCommand: flowToServerNeeded() = true
[jcc][t4][time:2022-01-13-12:22:28.089][Thread:main][tracepoint:1][Request.flush]
I.e. the test program does:
SetClientPiggybackCommand: flowToServerNeeded() = true
before Request.flush
but whether that is relevant or not I don't know yet
EDIT3:
[db2inst1#nya-03 ~]$ ls -lR sqllib/function/
sqllib/function/:
totalt 0
lrwxrwxrwx. 1 root db2iadm1 35 14 sep 14.15 db2json -> /opt/ibm/db2/V11.5/function/db2json*
lrwxrwxrwx. 1 root db2iadm1 36 14 sep 14.15 db2psmds -> /opt/ibm/db2/V11.5/function/db2psmds*
lrwxrwxrwx. 1 root db2iadm1 35 14 sep 14.15 db2rtsc -> /opt/ibm/db2/V11.5/function/db2rtsc*
lrwxrwxrwx. 1 root db2iadm1 34 14 sep 14.15 fpeevm -> /opt/ibm/db2/V11.5/function/fpeevm*
drwxrwxr-x. 3 db2inst1 db2iadm1 22 1 mar 2021 jar/
lrwxrwxrwx. 1 root db2iadm1 37 14 sep 14.15 libdb2u.a -> /opt/ibm/db2/V11.5/function/libdb2u.a*
drwxrwsr-t. 2 db2inst1 db2iadm1 6 23 feb 2021 routine/
lrwxrwxrwx. 1 root db2iadm1 33 14 sep 14.15 tblpd -> /opt/ibm/db2/V11.5/function/tblpd*
drwxrwsr-t. 2 db2inst1 db2iadm1 37 14 sep 14.15 unfenced/
sqllib/function/jar:
totalt 0
drwxrwxr-x. 2 db2inst1 db2iadm1 28 13 jan 09.48 DB2INST1/
sqllib/function/jar/DB2INST1:
totalt 12
-rw-rw-r--. 1 db2inst1 db2iadm1 8934 13 jan 09.48 STRINGUTIL.jar
sqllib/function/routine:
totalt 0
sqllib/function/unfenced:
totalt 0
lrwxrwxrwx. 1 root db2iadm1 44 14 sep 14.15 asnqmon -> /opt/ibm/db2/V11.5/function/unfenced/asnqmon*
lrwxrwxrwx. 1 root db2iadm1 45 14 sep 14.15 db2gsead -> /opt/ibm/db2/V11.5/function/unfenced/db2gsead*
I think I have found what caused the problem, atleast I can now create the function without a problem. The root cause is that Flyway appears to:
SET CURRENT_SCHEMA = <variable assigned via property -schemas>
When this is changed from the instance owner, db2 is unable to find the jar file. If I change the migration to:
set CURRENT SCHEMA = 'DB2INST1' #
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'STRINGUTIL:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION #
Everything works as expected. I'm not to excited about having to set current_path in the migration (and I'm not sure what effect it will have on Flyway), so I'll have a look if there is another property that can be used to assign a schema for FLYWAY_SCHEMA_HISTORY. But this works for now.
EDIT:
The following migration works if I remove -schemas as an argument to Flyway:
--#SET TERMINATOR #
values ('CURRENT SCHEMA', cast(CURRENT SCHEMA as varchar(100))) #
CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11)) RETURNS INTEGER RETURNS NULL ON NULL INPUT FENCED THREADSAFE DETERMINISTIC NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'STRINGUTIL:se.uhr.nya.commons.db.procedures.Proquint!quint2uint' NO EXTERNAL ACTION #
values NYA.QUINT_2_UINT('aabbccddeef') #
flyway -table="FLYWAY_SCHEMA_HISTORY" -driver=${driver} -url=jdbc:db2://${host}:${port}/${db} -user=${username} -password=${passwd} -jarDirs=${jarDirs} -locations="filesystem:${upgradedir}" migrate
Flyway is up to date
Flyway Community Edition 8.4.1 by Redgate
Database: jdbc:db2://130.239.91.235:50000/nyax (DB2/LINUXX8664 11.5)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 1 migration (execution time 00:00.017s)
Creating Schema History table "DB2INST1"."FLYWAY_SCHEMA_HISTORY" ...
Current version of schema "DB2INST1": << Empty Schema >>
Migrating schema "DB2INST1" to version "22.223.100.4"
+----------------+----------+
| 1 | 2 |
+----------------+----------+
| CURRENT SCHEMA | DB2INST1 |
+----------------+----------+
+-----+
| 1 |
+-----+
| 274 |
+-----+
If I add a specific schema as in:
flyway -schemas=NYA_FLYWAY -table="FLYWAY_SCHEMA_HISTORY" -driver=${driver} -url=jdbc:db2://${host}:${port}/${db} -user=${username} -password=${passwd} -jarDirs=${jarDirs} -locations="filesystem:${upgradedir}" migrate
Flyway is up to date
Flyway Community Edition 8.4.1 by Redgate
Database: jdbc:db2://130.239.91.235:50000/nyax (DB2/LINUXX8664 11.5)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Creating schema "NYA_FLYWAY" ...
Creating Schema History table "NYA_FLYWAY"."FLYWAY_SCHEMA_HISTORY" ...
Current version of schema "NYA_FLYWAY": null
Migrating schema "NYA_FLYWAY" to version "22.223.100.4"
+----------------+------------+
| 1 | 2 |
+----------------+------------+
| CURRENT SCHEMA | NYA_FLYWAY |
+----------------+------------+
ERROR: Migration of schema "NYA_FLYWAY" to version "22.223.100.4" failed! Changes successfully rolled back.
CURRENT_SCHEMA is changed to NYA_FLYWAY and I assume this is why Db2 can not locate the jar file. If I explicitly set CURRENT_SCHEMA in the migration:
--#SET TERMINATOR #
set CURRENT_SCHEMA = 'DB2INST1' #
values ('CURRENT SCHEMA', cast(CURRENT SCHEMA as varchar(100))) #
...
It once again works as expected:
flyway -schemas=NYA_FLYWAY -table="FLYWAY_SCHEMA_HISTORY" -driver=${driver} -url=jdbc:db2://${host}:${port}/${db} -user=${username} -password=${passwd} -jarDirs=${jarDirs} -locations="filesystem:${upgradedir}" migrate
Flyway is up to date
Flyway Community Edition 8.4.1 by Redgate
Database: jdbc:db2://130.239.91.235:50000/nyax (DB2/LINUXX8664 11.5)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 2 migrations (execution time 00:00.018s)
Current version of schema "NYA_FLYWAY": null
Migrating schema "NYA_FLYWAY" to version "22.223.100.4"
+----------------+----------+
| 1 | 2 |
+----------------+----------+
| CURRENT SCHEMA | DB2INST1 |
+----------------+----------+
+-----+
| 1 |
+-----+
| 274 |
+-----+
Also, if I change my little test prog so that it sets current_schema to 'NYA_FLYWAY' before creating the function, I get the same error:
java -cp .:/home/lejo0004/db2jcc4.jar tst //nya-03.its.umu.se:50000/nyax db2inst1 $passwd
**** Enter class tst
**** Loaded the JDBC driver
**** Created a JDBC connection to the data source
**** Created JDBC Statement object
CURRENT SCHEMA = NYA_FLYWAY
SQLException information
Error msg: DB2 SQL Error: SQLCODE=-20204, SQLSTATE=46008, SQLERRMC=NYA.QUINT_2_UINT, DRIVER=4.29.24
SQLSTATE: 46008
Error code: -20204
com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-20204, SQLSTATE=46008, SQLERRMC=NYA.QUINT_2_UINT, DRIVER=4.29.24
at com.ibm.db2.jcc.am.b7.a(b7.java:815)
at com.ibm.db2.jcc.am.b7.a(b7.java:66)
at com.ibm.db2.jcc.am.b7.a(b7.java:140)
at com.ibm.db2.jcc.am.k9.c(k9.java:2844)
at com.ibm.db2.jcc.am.k9.d(k9.java:2828)
at com.ibm.db2.jcc.am.k9.b(k9.java:2188)
at com.ibm.db2.jcc.t4.ab.k(ab.java:444)
at com.ibm.db2.jcc.t4.ab.c(ab.java:102)
at com.ibm.db2.jcc.t4.p.b(p.java:38)
at com.ibm.db2.jcc.t4.av.h(av.java:124)
at com.ibm.db2.jcc.am.k9.ak(k9.java:2183)
at com.ibm.db2.jcc.am.k9.a(k9.java:3387)
at com.ibm.db2.jcc.am.k9.e(k9.java:1135)
at com.ibm.db2.jcc.am.k9.execute(k9.java:1114)
at tst.main(tst.java:61)
FWIW, this can also be reproduced via clp:
[db2inst1#nya-03 ~]$ db2 "set current_schema = 'DB2INST1'"
DB20000I The SQL command completed successfully.
[db2inst1#nya-03 ~]$ db2 "CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION"
DB20000I The SQL command completed successfully.
[db2inst1#nya-03 ~]$ db2 "set current_schema = 'NYA_FLYWAY'"
DB20000I The SQL command completed successfully.
[db2inst1#nya-03 ~]$ db2 "CREATE OR REPLACE FUNCTION NYA.QUINT_2_UINT( I VARCHAR(11))
RETURNS INTEGER
RETURNS NULL ON NULL INPUT
FENCED THREADSAFE
DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME
'StringUtil:se.uhr.nya.commons.db.procedures.Proquint!quint2uint'
NO EXTERNAL ACTION"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL20204N The user defined function or procedure "NYA.QUINT_2_UINT" was
unable to map to a single Java method. LINE NUMBER=10. SQLSTATE=46008
One might ask why I insist on setting schema- and table- for flyway. As for the table name, the reason is that Flyway otherwise creates them with as quoted identifiers in lowercase. It is a painful experience having to quote these identifiers every time you need to query the table (especially when querying the table from sh). Unfortunately I have not found a way to influence Flyway to behave when it comes to the name for columns, so you will still have to quote them as in:
db2 "select \"version\" from ..."
I tried manually creating the table, but the flyway fails to handle it. I have not tried it yet, but I may add generated columns or a view for the purpose.
As for the schema name, I've got several products that run their own instance of Flyway. It feels much easier to use the schema + "_FLYWAY" for their instance. I don't want to put the flyway table in the product schema since I run validation scripts on the schema before each committed version.
I also would like to add that I only tried this with flyway community 8.4.1, there may be some other error with flyway community 8.0.5 which I started with
Many thanks to mao and Mark for their input (this will probably be removed but now I have added it:-)

The sql works fine but with python it doesn't insert values into table

I'm trying to use python for stored procs in sql, I have tested my sql code and it works fine, but when I execute it via python, the values are not inserted into my table
Note: I don't have any errors when executing
My code below:
import psycopg2
con = psycopg2.connect(dbname='dbname'
, host='host'
, port='5439', user='username', password='password')
def executeScriptsfromFile(filename):
#Open and read the file as a single buffer
cur = con.cursor()
fd = open(filename,'r')
sqlFile = fd.read()
fd.close()
#all SQL commands(split on ';')
sqlCommands = filter(None,sqlFile.split(';'))
#Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
try:
cur.execute(command)
con.commit()
except Exception as inst:
print("Command skipped:", inst)
cur.close()
executeScriptsfromFile('filepath.sql')
Insert comment in sql:
INSERT INTO schema.users
SELECT
UserId
,Country
,InstallDate
,LastConnectDate
FROM #Source;
Note: As I said the sql works perfectly fine when I tested it.

Python psycopg2 - using .format() with a dbname inside a string

I'm using psycopg2 to query a database that starts with a number + ".district", so my code goes like:
number = 2345
cur = conn.cursor()
myquery = """ SELECT *
FROM {0}.districts
;""".format(number)
cur.execute("""{0};""".format(query))
data = cur.fetchall()
conn.close()
And i keep receiving the following psycopg2 error..
psycopg2.ProgrammingError: syntax error at or near "2345."
LINE 1: SELECT * FROM 2345.districts...
Thought it was the type of data the problem, maybe int(number) or str(number)..but no, same error appears.
¿ What am i doing wrong ?
The way you are trying to use to pass parameters is not supported. Please read the docs.

How to get data out of a postgres bytea column into a python variable using sqlalchemy?

I am working with the script below.
If I change the script so I avoid the bytea datatype, I can easily copy data from my postgres table into a python variable.
But if the data is in a bytea postgres column, I encounter a strange object called memory which confuses me.
Here is the script which I run against anaconda python 3.5.2:
# bytea.py
import sqlalchemy
# I should create a conn
db_s = 'postgres://dan:dan#127.0.0.1/dan'
conn = sqlalchemy.create_engine(db_s).connect()
sql_s = "drop table if exists dropme"
conn.execute(sql_s)
sql_s = "create table dropme(c1 bytea)"
conn.execute(sql_s)
sql_s = "insert into dropme(c1)values( cast('hello' AS bytea) );"
conn.execute(sql_s)
sql_s = "select c1 from dropme limit 1"
result = conn.execute(sql_s)
print(result)
# <sqlalchemy.engine.result.ResultProxy object at 0x7fcbccdade80>
for row in result:
print(row['c1'])
# <memory at 0x7f4c125a6c48>
How to get the data which is inside of memory at 0x7f4c125a6c48 ?
You can cast it use python bytes()
for row in result:
print(bytes(row['c1']))