go to post Kevin Chan · Jun 1, 2020 Having the jar in the same directory as the application may not be enough to ensure that the JAR is loaded into the vm. How are you running the logstash application? Is it through a GUI or CLI? If CLI, can you paste (with any sensitive information redacted ofc) the command your running?
go to post Kevin Chan · May 14, 2020 Use a Java Gateway if that is available to you. There's a JDBC example (it uses InterSystems' JDBC driver, but the code can be replaced with the proper driver if you're familiar with JDBC since it users DriverManager) under %Net.Remote.Java.Test in the JDBC method
go to post Kevin Chan · May 13, 2020 https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=BSQG_jdbc
go to post Kevin Chan · Mar 19, 2020 Is this Dynamic or Embedded SQL? I am trying to run this in the server management portal and it does not work with a stub table.
go to post Kevin Chan · Mar 11, 2020 w $system.Status.GetErrorText(##class(SomeClass).IsNonNullCustomerID("1234"))
go to post Kevin Chan · Feb 4, 2020 ^PERFMON (https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_perfmon) ^MONLBL (https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCM_monlbl) ^GLOSTAT (https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCM_glostat) From what you mention, I believe ^GLOSTAT or ^PERFMON are two utilities that you will find very useful.
go to post Kevin Chan · Jan 15, 2020 To unfreeze: Do $SYSTEM.SQL.FreezePlans(0,1,,.Errors) // Unfreezes all SQL statement plans in the current namespace Do $SYSTEM.SQL.FreezePlans(2,1,,.Errors) // Unfreezes all SQL statement plans in the current namespace that were marked Frozen/Upgrade. Then execute $system.SQL.Purge() That should unfreeze everything and delete all CQs.
go to post Kevin Chan · Dec 30, 2019 The noted difference between %SQL.StatementResult.%Get() and %Library.ResultSet.%Get() is regarding the actual column names, not the values they contain.Given that I am using InterSystems IRIS, but here is how I reproduced your example (I don't use a left-join, but they should behave the same) CREATE TABLE testTable("Column A" INT, "Column B" INT, "Column C" INT, "Column D" INT) INSERT INTO testTable VALUES(1,2,3,4) INSERT INTO testTable VALUES(1 NULL, NULL,4) ------------------------- USER>set stmt = ##class(%SQL.Statement).%New() USER>set query = 1, query(1) = "SELECT * FROM testTable" USER>write stmt.%Prepare(.query) 1 USER>set rs = stmt.%Execute() USER>write rs.%Next() 1 USER>write rs.%Get("Column B") 2 USER>write rs.%Next() 1 USER>zwrite rs.%Get("Column B") "" USER>do $system.Status.DisplayError(rs.%Get("Column E")) DO $SYSTEM.Status.DisplayError(rs.%Get("Column E")) ^ <PROPERTY DOES NOT EXIST> *Column E,%sqlcq.USER.cls15 As you can see, %SQL.StatementResult.%Get() should only throw an error if you pass in an invalid column name such as "Column E" in the code snippet above. I recommend that you check the %SQL.StatementMetadata to check if the columns exist in the first place. USER>set rsmd = rs.%GetMetadata() USER>set columns = $LB() USER>for i=0:1:rsmd.columnCount-1 set $li(columns,i+1)=rsmd.columns.GetNext(i).colName Once you have columns populated, you can use $LISTFIND to determine whether or not the column exists. If you cannot do the above then you can wrap the use of %SQL.StatementResult.%Get() with a try-catch block as seen below: while(rs.%Next()) { try { set var = rs.%Get(columnName) } catch { set var = "" } } I do not recommend the try-catch fallback assignment
go to post Kevin Chan · Nov 28, 2019 https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSQL_procedures I believe this page explains why, and I will also try my best to condense information: Stored Procedures that return a single value are classified as Stored Functions. These can be SELECTed but not Stored Procedures. Class Queries are SQL-Invokable-Routines (SIRs), but they have additional ClassMethods defined that allow it to be SELECTed. This is namely the <<name>>EXECUTE() and <<name>>FETCH() functions. This is reflected in the CREATE QUERY documentation that warns if EXECUTE() and FETCH() are not defined, SQLCODE -46 is thrown. ( https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_createquery)
go to post Kevin Chan · Oct 29, 2019 If you have a java.sql.PreparedStatement and what seems to be a java.io.InputStream subclass (since you can call read() on it), why not utilize java.sql.PreparedStatement.setBinaryStream(int parameterIndex, InputStream x)? I am not sure which version of com.intersys.jdbc.CacheDriver you are using, but it is likely that your driver version has that API supported. try ( java.sql.Connection cnxn = DriverMasnager.getConnection(url, cnxnProps); java.sql.PreparedStatement pstmt = cnxn.prepareStatement( "INSERT INTO tableWithBlobField VALUES(?)"); ){ pstmt.setBinaryStream(1, binaryStreamFromRestAPI); pstmt.executeUpdate(); }