Grails 4 oracle connection stuck - oracle

When the application starts up it is validating the connection. This is the last log entry while it sits there waiting.
2020-07-29 15:01:20.743 INFO --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.Oracle12cDialect
It makes a connection in the DB and tries to run this.
SELECT 'NUMBER' AS type_name
, 2 AS data_type
, 38 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'CHAR' AS type_name
, 1 AS data_type
, 2000 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'CHAR' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NCHAR' AS type_name
, -15 AS data_type
, 2000 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'NCHAR' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'VARCHAR2' AS type_name
, 12 AS data_type
, 4000 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'VARCHAR2' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NVARCHAR2' AS type_name
, -9 AS data_type
, 4000 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'nVARCHAR2' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'DATE' AS type_name
, 93 AS data_type
, 7 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'DATE' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'DATE' AS type_name
, 92 AS data_type
, 7 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'DATE' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'TIMESTAMP' AS type_name
, 93 AS data_type
, 11 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'TIMESTAMP' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'TIMESTAMP WITH TIME ZONE' AS type_name
, -101 AS data_type
, 13 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'TIMESTAMP WITH TIME ZONE' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'TIMESTAMP WITH LOCAL TIME ZONE' AS type_name
, -102 AS data_type
, 11 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'TIMESTAMP WITH LOCAL TIME ZONE' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'INTERVALYM' AS type_name
, -103 AS data_type
, 5 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'INTERVALYM' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'INTERVALDS' AS type_name
, -104 AS data_type
, 4 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'INTERVALDS' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'RAW' AS type_name
, -3 AS data_type
, 2000 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'RAW' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'LONG' AS type_name
, -1 AS data_type
, 2147483647 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'LONG' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'LONG RAW' AS type_name
, -4 AS data_type
, 2147483647 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'LONG RAW' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NUMBER' AS type_name
, -7 AS data_type
, 1 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, '(1)' AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NUMBER' AS type_name
, -6 AS data_type
, 3 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, '(3)' AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NUMBER' AS type_name
, 5 AS data_type
, 5 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, '(5)' AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NUMBER' AS type_name
, 4 AS data_type
, 10 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, '(10)' AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NUMBER' AS type_name
, -5 AS data_type
, 38 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'NUMBER' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'FLOAT' AS type_name
, 6 AS data_type
, 63 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'FLOAT' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'REAL' AS type_name
, 7 AS data_type
, 63 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 3 AS searchable
, 0 AS unsigned_attribute
, 1 AS fixed_prec_scale
, 0 AS auto_increment
, 'REAL' AS local_type_name
, -84 AS minimum_scale
, 127 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'BLOB' AS type_name
, 2004 AS data_type
, -1 AS precision
, NULL AS literal_prefix
, NULL AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 0 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'BLOB' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'CLOB' AS type_name
, 2005 AS data_type
, -1 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'CLOB' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'NCLOB' AS type_name
, 2011 AS data_type
, -1 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'NCLOB' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'REF' AS type_name
, 2006 AS data_type
, 0 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'REF' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'ARRAY' AS type_name
, 2003 AS data_type
, 0 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'ARRAY' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
UNION
SELECT 'STRUCT' AS type_name
, 2002 AS data_type
, 0 AS precision
, '''' AS literal_prefix
, '''' AS literal_suffix
, NULL AS create_params
, 1 AS nullable
, 1 AS case_sensitive
, 0 AS searchable
, 0 AS unsigned_attribute
, 0 AS fixed_prec_scale
, 0 AS auto_increment
, 'STRUCT' AS local_type_name
, 0 AS minimum_scale
, 0 AS maximum_scale
, NULL AS sql_data_type
, NULL AS sql_datetime_sub
, 10 AS num_prec_radix
FROM DUAL
ORDER BY data_type
I think it never finishes. Grails just hangs waiting. If I kill the oracle session then it continues on and the app loads. I am running DEBUG logging and the next log entry is this.
2020-07-29 15:01:37.142 DEBUG --- [ main] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Environment details
Grails 4.0.4
Oracle DB version 12.1.0.2.0
JDBC 4.1
Oracle JDBC 12c drivers
application.yml
---
grails:
profile: web
codegen:
defaultPackage: btpg
gorm:
reactor:
# Whether to translate GORM events into Reactor events
# Disabled by default for performance reasons
events: false
info:
app:
name: '#info.app.name#'
version: '#info.app.version#'
grailsVersion: '#info.app.grailsVersion#'
spring:
jmx:
unique-names: true
main:
banner-mode: "off"
groovy:
template:
check-template-location: false
devtools:
restart:
additional-exclude:
- '*.gsp'
- '**/*.gsp'
- '*.gson'
- '**/*.gson'
- 'logback.groovy'
- '*.properties'
management:
endpoints:
enabled-by-default: false
---
grails:
mime:
disable:
accept:
header:
userAgents:
- Gecko
- WebKit
- Presto
- Trident
types:
all: '*/*'
atom: application/atom+xml
css: text/css
csv: text/csv
form: application/x-www-form-urlencoded
html:
- text/html
- application/xhtml+xml
js: text/javascript
json:
- application/json
- text/json
multipartForm: multipart/form-data
pdf: application/pdf
rss: application/rss+xml
text: text/plain
hal:
- application/hal+json
- application/hal+xml
xml:
- text/xml
- application/xml
urlmapping:
cache:
maxsize: 1000
controllers:
defaultScope: singleton
converters:
encoding: UTF-8
views:
default:
codec: html
gsp:
encoding: UTF-8
htmlcodec: xml
codecs:
expression: html
scriptlet: html
taglib: none
staticparts: none
management:
endpoints:
jmx:
unique-names: true
---
hibernate:
cache:
queries: false
use_second_level_cache: false
use_query_cache: false
dataSource:
pooled: false
jmxExport: false
driverClassName: oracle.jdbc.OracleDriver
username: 'xxx'
password: 'xxx'
environments:
development:
dataSource:
dbCreate: none
url: jdbc:oracle:thin:#10.10.99.110:1521:SMPL
properties:
jmxEnabled: false
initialSize: 5
maxActive: 50
minIdle: 5
maxIdle: 25
maxWait: 10000
maxAge: 600000
timeBetweenEvictionRunsMillis: 5000
minEvictableIdleTimeMillis: 60000
validationQuery: SELECT 1 from dual;
validationQueryTimeout: 15
validationInterval: 15000
testOnBorrow: true
testWhileIdle: true
testOnReturn: false
jdbcInterceptors: ConnectionState
defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
test:
dataSource:
dbCreate: none
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
production:
dataSource:
dbCreate: none
url: jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
properties:
jmxEnabled: true
initialSize: 5
maxActive: 50
minIdle: 5
maxIdle: 25
maxWait: 10000
maxAge: 600000
timeBetweenEvictionRunsMillis: 5000
minEvictableIdleTimeMillis: 60000
validationQuery: SELECT 1
validationQueryTimeout: 3
validationInterval: 15000
testOnBorrow: true
testWhileIdle: true
testOnReturn: false
jdbcInterceptors: ConnectionState
defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
Any help is greatly appreciated.

You need to specify the datasource dialect in your yaml file. The bolded line is what you are missing.
dataSource:
pooled: false
jmxExport: false
driverClassName: oracle.jdbc.OracleDriver
################ Add this line ###############
dialect: org.hibernate.dialect.Oracle12cDialect
username: 'xxx'
password: 'xxx'

Related

How to correct convert byte[] column from spring 3.2 #Column annotation to hibernate mapping

I use in hibernate.cfg.xml:
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
Works correctly:
#Column(columnDefinition = "LONGBLOB", nullable = false, updatable = true)
protected byte[] content;
in table (with data from import.sql. In import.sql "content" is of type longblob):
COLUMN_NAME
TYPE_NAME
IS_NULLABLE
DECIMAL_DIGITS
COLUMN_SIZE
COLUMN_DEF
REMARKS
DATA_TYPE
BUFFER_LENGTH
NUM_PREC_RADIX
NULLABLE
SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
ORDINAL_POSITION
CONTENT
BLOB
NO
0
2147483647
null
2004
2147483647
10
0
2004
0
2147483647
4
without import.sql (empty db):
COLUMN_NAME
TYPE_NAME
IS_NULLABLE
DECIMAL_DIGITS
COLUMN_SIZE
COLUMN_DEF
REMARKS
DATA_TYPE
BUFFER_LENGTH
NUM_PREC_RADIX
NULLABLE
SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
ORDINAL_POSITION
CONTENT
BLOB
NO
0
2147483647
null
2004
2147483647
10
0
2004
0
2147483647
3
When I do a db import (using h2-1.4.200.jar), in the table the field contains the type:
"CONTENT" LONGBLOB NOT NULL
Does not work properly:
<property name="content" type="byte[]" update="true">
<column name="content" sql-type="LONGBLOB" not-null="true"/></property>
in table (with data from import.sql. In import.sql "content" is of type longblob):
COLUMN_NAME
TYPE_NAME
IS_NULLABLE
DECIMAL_DIGITS
COLUMN_SIZE
COLUMN_DEF
REMARKS
DATA_TYPE
BUFFER_LENGTH
NUM_PREC_RADIX
NULLABLE
SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
ORDINAL_POSITION
CONTENT
BLOB
NO
0
2147483647
null
2004
2147483647
10
0
2004
0
2147483647
4
Resulting in invalid characters: �cw�%��6�ţ��ٟ�{^y���.
without import.sql (empty db):
COLUMN_NAME
TYPE_NAME
IS_NULLABLE
DECIMAL_DIGITS
COLUMN_SIZE
COLUMN_DEF
REMARKS
DATA_TYPE
BUFFER_LENGTH
NUM_PREC_RADIX
NULLABLE
SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
ORDINAL_POSITION
CONTENT
BLOB
NO
0
2147483647
null
2004
2147483647
10
0
2004
0
2147483647
2
How to write correct hibernate mapping similar to #Column Spring annotation?
I tried using (no effect):
<property name="hibernate.jdbc.use_streams_for_binary">false</property>
and
<property name="hibernate.jdbc.use_streams_for_binary">true</property>

Hibernate and H2 no dialect mapping for jdbc type 0

Im running this Query via JpaRepository on MSSQL Server and it works fine
SELECT TOP(8) * FROM (
SELECT distinct a.id as source_id
, null as f_name
, null as m_name
, null as last_name
, null as full_name
, a.name as business_name
, a.dba_name as dba_name
, ad.id as address_id
, ad.line_1 as address_line_1
, ad.city_town as city
, right(tr.code,2) as state
, ad.zip_postal_code as postal_code
, co.name as country_name
, a.national_tax_ident as id_number
, 'T' as id_number_type
, null as date_of_birth
, 'SuretyVP' as data_source_id
, 'AGENT' as role_id
, getdate() as cycle_date
, 299 as create_user_id
, getdate() as create_date
, null as update_date
, null as attention
, 'agency' as entity_name
from dbo.Agency a
inner join dbo.agency_address ag on a.id = ag.agency_id
inner join dbo.address ad on ad.id = ag.address_id
inner join [AdminDB].[dbo].[countries] co
on ad.country_id = co.id
inner join [AdminDB].[dbo].[territories] tr
on ad.state_province_territory_id = tr.id
Where a.ofac_processed_ind = 0
AND ag.address_type_id = 2
AND ag.exp_date is null
AND a.agency_status_id = 1
UNION ALL
SELECT distinct c.id as source_id
, c.first_name as f_name
, c.middle_name as m_name
, c.last_name as last_name
, null as full_name
, null as business_name
, null as dba_name
, null as address_id
, null as address_line_1
, null as city
, null as state
, null as postal_code
, 'United States' as country_name
, null as id_number
, null as id_number_type
, null as date_of_birth
, 'SuretyVP' as data_source_id
, 'AGENT' as role_id
, getdate() as cycle_date
, 299 as create_user_id
, getdate() as create_date
, null as update_date
, null as attention,
'contact' as entity_name
from dbo.Contact c
inner join dbo.Agency_contact ac on c.id = ac.contact_id
inner join dbo.agency a on ac.agency_id = a.id
Where c.ofac_processed_ind = 0
AND a.agency_status_id = 1
ANd c.exp_date is null
ANd ac.exp_date is null
AND ac.contact_role_type_id = 12) as data
But when I try to Run integration test with this query against H2 DB I have the following error
No dialect mapping for jdbc type 0
Here is my H2 DB config spring.datasource.url=jdbc:h2:mem:test:SAMINTEGERATIONTEST;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MSSQLServer
I saw similar topics, but unfortunately didn't find solution for my problem.
I would be very grateful for any advice.Thank you!
null as full_name, null as date_of_birth, null as update_date, and null as attention don't have a data type in both first and second queries, therefore UNION ALL also can't determine the data type. H2 by itself doesn't care about this situation and assumes that these columns have a fake NULL data type and can have only NULL value. But your persistence libraries don't like it.
The simplest solution is to add a CAST to all these columns in one of the queries (or in both of them, if you wish, it doesn't matter):
CAST(null AS VARCHAR) as full_name,
…
CAST(null AS DATE) as date_of_birth,
…

Error(57,5): PL/SQL: ORA-00984: column not allowed here for creating stored procedures

I have created a stored procedure but while compiling it, I am getting error as
Error(57,5): PL/SQL: ORA-00984: column not allowed here
Below is my query
create or replace PROCEDURE NEIQC_DATA_DUMP_MST AS
BEGIN
execute immediate 'truncate table TBL_NEIQC_WF_SITE_MST';
INSERT INTO TBL_NEIQC_WF_SITE_MST
(
OBJECTID,
SAP_ID,
NETWORK_ENTITY_ID ,
SITE_NAME ,
SITE_ADDRESS ,
MAINTENANCEZONE_CODE ,
INVENTORY_TYPE ,
TYPE_NAME ,
SITE_STATUS_CODE ,
NE_MODIFIED_DATE ,
NE_MODIFIED_BY ,
CREATED_DATE ,
CREATED_BY ,
STRUCTURE_NAME ,
RJ_CITY_CODE ,
RJ_R4G_STATE_CODE ,
RJ_DISTRICT_CODE ,
RJ_TALUK_CODE ,
RJ_JC_CODE ,
RJ_JIOPOINT_SAPCODE ,
RJ_COMPANY_CODE_1 ,
RJ_COMPANY_CODE_2
)
VALUES
(
OBJECTID ,
RJ_SAPID,
RJ_NETWORK_ENTITY_ID ,
RJ_SITE_NAME ,
RJ_SITE_ADDRESS ,
RJ_MAINTENANCE_ZONE_CODE ,
'',
TYPE_NAME ,
'ACTIVE',
RJ_LAST_MODIFIED_DATE,
RJ_LAST_MODIFIED_BY ,
SYSDATE,
'SCHEDULER',
STRUCTURE_NAME ,
RJ_CITY_CODE ,
RJ_R4G_STATE_CODE ,
RJ_DISTRICT_CODE ,
RJ_TALUK_CODE ,
RJ_JC_CODE ,
RJ_JIOPOINT_SAPCODE ,
RJ_COMPANY_CODE_1 ,
RJ_COMPANY_CODE_2
);
COMMIT;
END NEIQC_DATA_DUMP_MST;
please suggest what is wrong
your insert Statement should look like
INSERT INTO TBL_NEIQC_WF_SITE_MST
(
OBJECTID,
SAP_ID,
NETWORK_ENTITY_ID ,
SITE_NAME ,
SITE_ADDRESS ,
MAINTENANCEZONE_CODE ,
INVENTORY_TYPE ,
TYPE_NAME ,
SITE_STATUS_CODE ,
NE_MODIFIED_DATE ,
NE_MODIFIED_BY ,
CREATED_DATE ,
CREATED_BY ,
STRUCTURE_NAME ,
RJ_CITY_CODE ,
RJ_R4G_STATE_CODE ,
RJ_DISTRICT_CODE ,
RJ_TALUK_CODE ,
RJ_JC_CODE ,
RJ_JIOPOINT_SAPCODE ,
RJ_COMPANY_CODE_1 ,
RJ_COMPANY_CODE_2
)
select
OBJECTID ,
RJ_SAPID,
RJ_NETWORK_ENTITY_ID ,
RJ_SITE_NAME ,
RJ_SITE_ADDRESS ,
RJ_MAINTENANCE_ZONE_CODE ,
'',
TYPE_NAME ,
'ACTIVE',
RJ_LAST_MODIFIED_DATE,
RJ_LAST_MODIFIED_BY ,
SYSDATE,
'SCHEDULER',
STRUCTURE_NAME ,
RJ_CITY_CODE ,
RJ_R4G_STATE_CODE ,
RJ_DISTRICT_CODE ,
RJ_TALUK_CODE ,
RJ_JC_CODE ,
RJ_JIOPOINT_SAPCODE ,
RJ_COMPANY_CODE_1 ,
RJ_COMPANY_CODE_2
from ne_structures -- if this is your table
;

oracle sql hierarchical queries

I have two tables:
CREATE TABLE CATEGORY (
cat_id NUMBER PRIMARY KEY,
cat_ust_id NUMBER REFERENCES Category( cat_id )
);
CREATE TABLE PRODUCT (
cat_1 NUMBER REFERENCES Category( cat_id ),
cat_2 NUMBER REFERENCES Category( cat_id ),
cat_3 NUMBER REFERENCES Category( cat_id ),
cat_4 NUMBER REFERENCES Category( cat_id ),
cat_id NUMBER PRIMARY KEY
REFERENCES Category( cat_id )
);
INSERT INTO Category
SELECT 1, NULL FROM DUAL UNION ALL
SELECT 2, NULL FROM DUAL UNION ALL
SELECT 11, 1 FROM DUAL UNION ALL
SELECT 112, 11 FROM DUAL UNION ALL
SELECT 202, 24 FROM DUAL UNION ALL
SELECT 24, 2 FROM DUAL UNION ALL
SELECT 2035, 203 FROM DUAL UNION ALL
SELECT 203, 20 FROM DUAL UNION ALL
SELECT 20, 2 FROM DUAL;
INSERT INTO Product
SELECT 1, NULL, NULL, NULL, 11 FROM DUAL UNION ALL
SELECT 2, NULL, NULL, NULL, 202 FROM DUAL UNION ALL
SELECT 1, NULL, NULL, NULL, 112 FROM DUAL UNION ALL
SELECT 2, NULL, NULL, NULL, 2035 FROM DUAL;
In PRODUCT table, I have to update some column according to CATEGORY table hierarchy to get this result:
cat_1 | cat_2 | cat_3 | cat_4 | cat_id
---------------------------------------
1 | 11 | NULL | NULL | 11
2 | 24 | 202 | NULL | 202
1 | 11 | 112 | NULL | 112
2 | 24 | 203 | 2035 | 2035
Should I create a procedure or function for this?
Oracle Setup:
CREATE TABLE Category ( CAT_ID, CAT_UST_ID ) AS
SELECT 1, NULL FROM DUAL UNION ALL
SELECT 2, NULL FROM DUAL UNION ALL
SELECT 11, 1 FROM DUAL UNION ALL
SELECT 112, 11 FROM DUAL UNION ALL
SELECT 202, 24 FROM DUAL UNION ALL
SELECT 24, 2 FROM DUAL UNION ALL
SELECT 2035, 203 FROM DUAL UNION ALL
SELECT 203, 20 FROM DUAL UNION ALL
SELECT 20, 2 FROM DUAL;
CREATE TABLE Product ( Cat1, Cat2, Cat3, Cat4, Cat_ID ) AS
SELECT 1, CAST( NULL AS NUMBER ), CAST( NULL AS NUMBER ), CAST( NULL AS NUMBER ), 11 FROM DUAL UNION ALL
SELECT 2, NULL, NULL, NULL, 202 FROM DUAL UNION ALL
SELECT 1, NULL, NULL, NULL, 112 FROM DUAL UNION ALL
SELECT 2, NULL, NULL, NULL, 2035 FROM DUAL;
Update:
UPDATE Product p
SET ( cat1, cat2, cat3, cat4 ) = (
SELECT new_cat1,
new_cat2,
new_cat3,
new_cat4
FROM (
SELECT TO_NUMBER( REGEXP_SUBSTR( SYS_CONNECT_BY_PATH( CAT_ID, ',' ), '\d+', 1, 1 ) ) AS new_cat1,
TO_NUMBER( REGEXP_SUBSTR( SYS_CONNECT_BY_PATH( CAT_ID, ',' ), '\d+', 1, 2 ) ) AS new_cat2,
TO_NUMBER( REGEXP_SUBSTR( SYS_CONNECT_BY_PATH( CAT_ID, ',' ), '\d+', 1, 3 ) ) AS new_cat3,
TO_NUMBER( REGEXP_SUBSTR( SYS_CONNECT_BY_PATH( CAT_ID, ',' ), '\d+', 1, 4 ) ) AS new_cat4,
cat_id
FROM Category
START WITH CAT_UST_ID IS NULL
CONNECT BY CAT_UST_ID = PRIOR CAT_ID
) c
WHERE p.cat_id = c.cat_id
);
Results:
SELECT * FROM Product;
gives:
CAT1 CAT2 CAT3 CAT4 CAT_ID
---------- ---------- ---------- ---------- ----------
1 11 11
2 24 202 202
1 11 112 112
2 20 203 2035 2035

oracle: counting number of null fields in a row

I have a table that has 5 "optional" fields. I'd like to find out how many rows have all 5 null, how many have 1 field non-null, etc.
I've tried a couple of things, like:
select
count(*),
( (if field1 is null then 1 else 0) +
(if field2 is null then 1 else 0) +
etc.
but of course that doesn't work.
Ideally, I'm looking for output that's something like
Nulls Cnt
0 200
1 345
...
5 40
Is there an elegant solution?
The keyword is not if, it is case, and you must use end to end the case statement.
Here is a query that can suit you:
WITH subQuery AS
(
SELECT My_Table.*, (CASE WHEN My_Table.field1 IS NULL THEN 1 ELSE 0 END +
CASE WHEN My_Table.field2 IS NULL THEN 1 ELSE 0 END +
CASE WHEN My_Table.field3 IS NULL THEN 1 ELSE 0 END +
CASE WHEN My_Table.field4 IS NULL THEN 1 ELSE 0 END +
CASE WHEN My_Table.field5 IS NULL THEN 1 ELSE 0 END ) NumberOfNullFields
FROM My_Table
)
SELECT NumberOfNullFields, COUNT(*)
FROM subQuery
GROUP BY NumberOfNullFields;
While there is nothing wrong with the case WHEN counting, I just wanted to see if there was another way.
WITH SAMPLEDATA AS(--just generate some data with nulls for 5 cols
select level ,
(case when mod(level,2) = 0 then 1 else null end) colA,
(case when mod(level,3) = 0 then 1 else null end) colB,
(case when mod(level,5) = 0 then 1 else null end) colC,
(case when mod(level,7) = 0 then 1 else null end) colD,
(case when mod(level,11) = 0 then 1 else null end) colE
from dual
connect by level < 1000
), --utilize the count(Aggregate)'s avoidance of nulls to our summation advantage
nullCols as(
SELECT COUNT(COLA) aNotNull
,cOUNT(*)-COUNT(COLA) aNull
,count(colB) bNotNull
,cOUNT(*)-count(colB) bNull
,count(colc) cNotNull
,cOUNT(*)-count(colc) cNull
,count(cold) dNotNull
,cOUNT(*)-count(cold) dNull
,count(cole) eNotNull
,cOUNT(*)-count(cole) eNull
, cOUNT(*) TotalCountOfRows
from SAMPLEDATA )
SELECT (select count(*) from sampledata where cola is null and colb is null and colc is null and cold is null and cole is null) allIsNull
,nullCols.*
FROM nullCols;
ALLISNULL ANOTNULL ANULL BNOTNULL BNULL CNOTNULL CNULL DNOTNULL DNULL ENOTNULL ENULL TOTALCOUNTOFROWS
---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
207 499 500 333 666 199 800 142 857 90 909 999
this utilizes the
If expression in count(expression)
evaluates to null, it is not counted:
as noted from here
This method, as is obvious above, does not 'eloquently' sum all null columns well. Just wanted to see if this was possible without the CASE logic.

Resources